我正在使用带有一组使用setString(pos,value)的参数的JDBC预处理语句。表上的基础列都是NCHAR和NVARCHAR2。我已将Oracle JDBC驱动程序设置为“ defaultNChar = true”,以便Oracle DB始终将我的参数视为本国语言字符。驱动程序文件为“ ojdbc6.jar”。
我的问题:我的参数化查询使用“ defaultNChar = true”的速度极慢。但是,一旦我设置“ defaultNChar = false”,查询就会变得非常快]](3秒)。
查询用法如下:
String sql = "INSERT INTO MYTABLE_ERROR(MY_NAME,MY_FLAG,MY_VALUE) " + "SELECT ? AS MY_NAME," + "? AS MY_FLAG,v.MY_VALUE" + " FROM OTHER_TABLE v" + " JOIN ( SELECT * FROM ... iv ... WHERE iv.MY_NAME = ? ) rule1 " + " ON v.\"MY_NAME\"=rule1.\"MY_NAME\" AND v.\"MY_VALUE\"=rule1.\"MY_VALUE\"" + " WHERE rule1.\"MY_NAME\" = ? AND v.\"MY_VALUE\" = ?"; preStatement = conn.prepareStatement (sql); int count = 1; for (String p : params) { // SLOW //preStatement.setNString (count++, p); // SLOW //preStatement.setObject (count++, p, Types.NVARCHAR); // SLOW preStatement.setString (count++, p); }
我一直试图找到为什么对我的“ Oracle数据库11g 11.2.0.3.0版-64位生产”数据库执行的预准备语句使用JDBC驱动程序时速度慢的原因” Oracle JDBC驱动程序11.2.0.3.0 ”。我找不到任何线索!
我什至得到了DB NLS配置,希望能找到任何东西,但我也不确定在这里:
NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_CHARACTERSET AL32UTF8 NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_COMP BINARY
请帮助!
谢谢,G。
更新:看起来以某种方式使用“ defaultNChar = true”时查询被卡住了。使用JConsole时出现此错误:
Total blocked: 1 Total waited: 1
Stack trace:
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(Unknown Source)
java.net.SocketInputStream.read(Unknown Source)
oracle.net.ns.Packet.receive(Packet.java:311)
oracle.net.ns.DataPacket.receive(DataPacket.java:103)
oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:312)
oracle.net.ns.NetInputStream.read(NetInputStream.java:257)
oracle.net.ns.NetInputStream.read(NetInputStream.java:182)
oracle.net.ns.NetInputStream.read(NetInputStream.java:99)
oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:121)
oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:77)
oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1173)
oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:309)
oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:200)
oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:543)
oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:238)
oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1446)
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1757)
oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4372)
oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:4539)
- locked oracle.jdbc.driver.T4CConnection@7f2315e5
oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:5577)
com.mycompany.test.DriverTest.fireStatement(DriverTest.java:253)
我正在使用带有一组使用setString(pos,value)的参数的JDBC预处理语句。表上的基础列都是NCHAR和NVARCHAR2。我已经设置了Oracle JDBC驱动程序的“ ...
您可以将PreparedStatement.setFormOfUse用于性能问题: