代码中对超时的处理太重要了,如果不处理会造成程序卡住,在weblogic中会形成stuck线程,非常可能导致整个节点缓慢。下面来展示下原生的JDBC代码超时设置:
package gg;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class TestReadBlob{
Connection con = null;
PreparedStatement pre = null;
ResultSet result = null;
public void runTest() {
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@10.11.15.18:1521:orcl";
String user = "SD_DEV";
String password = "SD_DEV";
con = DriverManager.getConnection(url, user, password);
String sql = "select * from student where id=? for update";
pre = con.prepareStatement(sql);
pre.setInt(1, 1);
pre.setQueryTimeout(5);//单位是秒
result = pre.executeQuery();
while (result.next())
System.out.println("学号:" + result.getInt("id") + "姓名:"
+ result.getString("name"));
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try{
if (result != null)
result.close();
if (pre != null)
pre.close();
if (con != null)
con.close();
System.out.println("数据库连接已关闭!");
}
catch (Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TestReadBlob testReadBlob = new TestReadBlob();
testReadBlob.runTest();
}
}
java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1281)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3594)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3638)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1495)
at gg.TestReadBlob.runTest(TestReadBlob.java:24)
at gg.TestReadBlob.main(TestReadBlob.java:51)
数据库连接已关闭!
mybatis设置:
全局设置,在mybatis配置文件的settings节点中,增加如下配置
<settings>
<setting name="defaultStatementTimeout" value="25"/>
</settings>
单独配置
<select
id="queryEvaluateAuditCount"
resultType="int"
parameterType="com.safety.accidentevent.dto.query.AccidentEvaluateQueryDTO"
timeout="20"
>
weblogic设置:
数据源文件jdbc-driver-params中配置
单位是ms
<property>
<name>oracle.jdbc.ReadTimeout</name>
<value>18000</value>
</property>