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)
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.
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 Properties
jetez 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"