Load JDBC Driver引起的死锁
来源:互联网 发布:淘宝开放平台api 权限 编辑:程序博客网 时间:2024/04/29 14:52
在初始化JDBC Connection Pool的时候出现了死锁。
经分析,该死锁出现的前提为:
1. Load 不同的JDBC Driver;
2. 要在不同的Thread中。
代码如下:
public class PoolTest {public static void main(String[] args) throws Exception {boolean dead = true;if (!dead) {Class.forName("net.sourceforge.jtds.jdbc.Driver");Class.forName("org.h2.Driver");}Thread a = new Thread(new PoolThreadA());Thread b= new Thread(new PoolThreadB());a.start();b.start();}}class PoolThreadA implements Runnable {@Overridepublic void run() {DataSource ds = initDataSource();try {Connection c = ds.getConnection();} catch (Exception e) {}}private static DataSource initDataSource() { String connectionString = "jdbc:jtds:sqlserver://10.16.33.204:1433;databaseName=master"; PoolProperties p = new PoolProperties(); p.setUrl(connectionString); p.setDriverClassName("net.sourceforge.jtds.jdbc.Driver"); p.setUsername("sa"); p.setPassword("Oliver123"); p.setJmxEnabled(true); p.setTestWhileIdle(false); p.setTestOnBorrow(true); p.setValidationQuery("SELECT 1"); p.setTestOnReturn(false); p.setValidationInterval(0); p.setTimeBetweenEvictionRunsMillis(30000); p.setMinIdle(100); p.setInitialSize(10); p.setMaxWait(10000); p.setRemoveAbandonedTimeout(60); p.setMinEvictableIdleTimeMillis(30000); p.setMinIdle(10); p.setMaxActive(0); p.setLogAbandoned(true); p.setRemoveAbandoned(true); p.setJdbcInterceptors( "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;" ); DataSource datasource = new DataSource(); datasource.setPoolProperties(p); return datasource; }}class PoolThreadB implements Runnable{@Overridepublic void run() {DataSource ds = initDataSource();try {Connection c = ds.getConnection();} catch (Exception e) {}}private static DataSource initDataSource() { String connectionString = "jdbc:h2:mem:test;MVCC=TRUE;MODE=Oracle;MULTI_THREADED=TRUE;DB_CLOSE_DELAY=-1"; PoolProperties p = new PoolProperties(); p.setUrl(connectionString); p.setDriverClassName("org.h2.Driver"); p.setUsername("sa"); p.setPassword(""); p.setJmxEnabled(true); p.setTestWhileIdle(false); p.setTestOnBorrow(true); p.setValidationQuery("SELECT 1"); p.setTestOnReturn(false); p.setValidationInterval(0); p.setTimeBetweenEvictionRunsMillis(30000); p.setMinIdle(100); p.setInitialSize(10); p.setMaxWait(10000); p.setRemoveAbandonedTimeout(60); p.setMinEvictableIdleTimeMillis(30000); p.setMinIdle(10); p.setMaxActive(0); p.setLogAbandoned(true); p.setRemoveAbandoned(true); p.setJdbcInterceptors( "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;" ); DataSource datasource = new DataSource(); datasource.setPoolProperties(p); return datasource; }}
比如 https://m.oschina.net/blog/289120
解决方法是把Load Class的地方放到线程外面。
0 0
- Load JDBC Driver引起的死锁
- 错误:“Cannot load JDBC driver class 'com.mysql.jdbc.Driver”的解决方法
- Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 错误的解决方案
- Maven中出现Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'的解决办法
- Cannot load JDBC driver class 'com.mysql.jdbc.Driver ' —— 一个坑爹的BUG
- 错误:“Cannot load JDBC driver class 'com.mysql.jdbc.Driver”的解决方法
- Cannot load JDBC driver class ${jdbc.driverClassName}
- maven 引入了mysql jdbc的Driver之后仍提示Cannot load driver class: com.mysql.jdbc.Driver
- HeapAlloc引起的死锁
- pthread_cancel引起的死锁
- pthread_cancel引起的死锁
- Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
- Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
- Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
- Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
- Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
- 解决Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
- Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
- 什么是NAT
- 安卓5.1浏览器禁止长按菜单
- FCKeditor的配置与使用
- hdu 5461 Largest Point
- JCO3远程调用SAP接口随笔二(输入、出参)
- Load JDBC Driver引起的死锁
- Github的Windows客户端创建分支
- Redis常用命令操作
- Filter与Servlet的区别和联系
- bzoj1040&CodeVS1423 骑士
- MySQL创建用户与授权方法
- hdu 5452 Minimum Cut
- C/C++中的字符串和字符数组
- 验证过期 authorization has expired