Connexion à Oracle à partir de Java Exception Exception


Je veux connecter une base de données Oracle distante mais j'ai une exception. Aider moi s'il vous plaît. Que puis-je faire?

J'ai essayé cela mais cela ne fonctionne pas:

   try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection con = DriverManager.getConnection(
                    "jdbc:oracle:thin:@*****:1521/******", "*********",
                    "********");
            Statement st = con.createStatement();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
             e.printStackTrace();
        }

Erreur d'obtention:

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
        at oracle.sql.converter.CharacterSetMetaData$JdbcCharacterSetMetaData.isFixedWidth(CharacterSetMetaData.java:1292)
        at oracle.sql.converter.CharacterSetMetaData.getRatio(CharacterSetMetaData.java:1230)
        at oracle.jdbc.driver.DBConversion.init(DBConversion.java:159)
        at oracle.jdbc.driver.DBConversion.<init>(DBConversion.java:112)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1075)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
Author: Piyush Gupta, 2016-03-01

2 answers

J'ai testé votre code que vous utilisez

DriverManager.getConnection(
    "jdbc:oracle:thin:@<host>:<port>:<sid>", "<user>", "<password>");

Pour supprimer / entre <port>/<sid> et mettre : entre <port>:<sid>

Votre code mis à jour sera

Connection con = DriverManager.getConnection(
                    "jdbc:oracle:thin:@*****:1521:******", "*********",
                    "********");

Et pour plus de détails, vous pouvez consulter ce lien http://docs.oracle.com/cd/E11882_01/appdev.112/e12137/getconn.htm#TDPJD136

J'espère que cela vous aidera.

 0
Author: Piyush Gupta, 2016-03-01 09:58:54

Votre URL de connexion est mal formatée. Vous mélangez le format SID et service.

Soit

DriverManager.getConnection(
    "jdbc:oracle:thin:<user>/<password>@<host>:<port>:<sid>");

Ou

DriverManager.getConnection(
    "jdbc:oracle:thin:@<host>:<port>:<sid>", "<user>", "<password>");

Ou si vous vous connectez à un service au lieu d'un SID

DriverManager.getConnection(
    "jdbc:oracle:thin:<user>/<password>@//<host>:<port>/<service");

Pour un exemple utilisant un objet Propertiesjetez un oeil dans le javadoc d'oracle.jdbc.OracleDriver

Edit Trouvez ici le lien vers la Syntaxe de nom de service de style fin

Edit 2 Activer la journalisation du pilote pour voir si il y aurait un message utile là-bas.

OracleLog.setTrace(true);
DriverManager.setLogWriter(new PrintWriter(System.out));

Edit 3 Voici un moyen de trouver par réflexion quel jeu de caractères est signalé par le serveur et le pilote.

Pour des raisons d'autorisation, la déclaration du paquet est importante.

package oracle.jdbc.driver;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import oracle.sql.CharacterSet;
import sun.reflect.ReflectionFactory;

public class OJdbcInfo {

    public static void main(String[] args) throws Exception {
        OracleLog.setTrace(true);
        DriverManager.setLogWriter(new PrintWriter(System.out));

        System.out.printf("defaultCharset: %s%n", Charset.defaultCharset());
        System.out.printf("file.encoding : %s%n", 
            System.getProperty("file.encoding"));

        String connectUrl = 
            "jdbc:oracle:thin:<user>/<password>@<host>:<port>:<sid>";

        try (Connection con = DriverManager.getConnection(connectUrl)) {
            T4CConnection t4Conn = (T4CConnection) con;
            T4C8TTIpro pro = t4Conn.pro;

            short oVersion = pro.oVersion;
            short svrCharSet = pro.svrCharSet;
            short driverCharSet;
            try {
                driverCharSet = DBConversion.findDriverCharSet(
                    svrCharSet, oVersion);
            } catch (ArrayIndexOutOfBoundsException e) {
                System.err.printf("failed to get driver charset: %s%n", 
                    e.getMessage());
                driverCharSet = -1;
            }

            System.out.println("server charset: " + svrCharSet);
            System.out.println("driver charset: " + driverCharSet);

            Object instance = ReflectionFactory.getReflectionFactory()
                    .newConstructorForSerialization(
                            Class.forName("oracle.sql.CharacterSetFactoryThin"),
                            Object.class.getConstructor())
                    .newInstance();

            for (Field fs : CharacterSet.class.getDeclaredFields()) {
                if (fs.getType() == short.class) {
                    if (fs.getShort(instance) == driverCharSet) {
                        System.out.printf("charset name  : %s%n", fs.getName());
                    }
                }
            }
        }
    }
}

Compiler

mkdir bin
javac -cp ojdbc6_g.jar -d bin/ OJdbcInfo.java

Exécuter

java -cp ojdbc6_g.jar:bin/ oracle.jdbc.driver.OJdbcInfo

Sortie possible

defaultCharset: UTF-8
file.encoding : UTF-8
server charset: 873
driver charset: 873
charset name  : AL32UTF8_CHARSET

Le jeu de caractères du pilote est probablement -1 dans votre cas.

, Vérifiez que vous utilisez un pilote à jour version.

java -jar ojdbc6.jar

Sortie possible

Oracle 11.2.0.4.0 JDBC 4.0 compiled with JDK6 on Thu_Jul_03_18:17:32_PDT_2014

Vérifiez le paramètre locale sur votre Linux box

locale

Sortie possible (dépend de votre paramètre de langue, mais toutes les valeurs doivent normalement être les mêmes)

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
 0
Author: SubOptimal, 2016-03-08 08:36:40