JDBCToolsV2:     利用ThreadLocal保证当前线程操作同一个数据库连接对象。

package com.dgd.test;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties; public class JDBCToolsV2 { private static DataSource ds;
private static ThreadLocal<Connection> th;
//静态代码块,创建数据库连接池
static {
try {
Properties p=new Properties();
p.load(JDBCToolsV1.class.getClassLoader().getResourceAsStream("druid.properties"));
ds= DruidDataSourceFactory.createDataSource(p);
th=new ThreadLocal<>();
} catch (Exception e) {
e.printStackTrace();
}
} public static Connection getConnection(){
//方式1: DriverManger.getConnection();
//方式2: 数据库连接池, ds.getConnection();
try {
Connection conn=th.get(); //获取当前线程的共享连接对象
if(conn==null) //当前线程没有拿过连接,第一个获取连接
{
conn=ds.getConnection();//从线程池中哪一个新的
th.set(conn); //放到当前线程共享变量中
}
return conn;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
//关闭连接方法
public static void free( Connection conn){
try {
Connection conn=th.get();   //获取当前线程的共享连接对象
            if(conn!=null)              //当前线程获取连接
            {
                conn.close();      //关闭当前数据库连接
            }
       th.set(null);           //将ThreadLocal设置为空,防止上次关闭,下次获取一个关闭的数据库连接

} catch (SQLException e) {
e.printStackTrace();
}
} public static int update3( String sql, Object... args) throws SQLException {
Connection conn=getConnection();
PreparedStatement ps=conn.prepareStatement(sql);
if(args!=null && args.length>0)
{
for (int i = 0; i <args.length ; i++) {
ps.setObject(i+1,args[i]);
}
}
int len=ps.executeUpdate();
ps.close();
return len;
}
}

Test:

package com.dgd.test;

import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException; public class TestJDBCToolV1 { @Test
public void test2() throws SQLException {
String sql1="INSERT INTO COURSE VALUES(NULL,?)";
String sql2="INSERT INTO COURSE VALUES(NULL,?)";
Connection conn= JDBCToolsV2.getConnection(); conn.setAutoCommit(false);
try {
int len1=JDBCToolsV2.update3(sql1,"美术");
int len2=JDBCToolsV2.update3(sql2,"体育");
if(len1>0 && len2>0)
{
conn.commit();
}
else
{
conn.rollback();
}
} catch (SQLException e) {
conn.rollback();
}
conn.setAutoCommit(true);
JDBCToolsV2.free(conn); }
}

最新文章

  1. css体验优化之图片容器设置宽高比
  2. ThreadLocal类学习笔记
  3. 餐厅系统app版
  4. UnicodeDecodeError while using json.dumps()
  5. 编译 curl with ssl
  6. 各个 Maven仓库 镜像(包括国内)
  7. [Redux] Filtering Redux State with React Router Params
  8. linux 命令c语言代码实现
  9. 基于VMware的eCos环境编译redboot(脚本配置redboot)
  10. codeforces 546D Soldier and Number Game
  11. IT忍者神龟之Java动态代理与CGLib代理
  12. cocos2d-x使用CCClippingNode实现跑马灯
  13. linux_vim_快捷键
  14. String.format()的使用
  15. python之路——24
  16. MongoDB pymongo模块 删除数据
  17. 用Python读取文件
  18. Oracle 故障整理
  19. Redis-安装时问题整理
  20. filter中的DelegatingFilterProxy使用事例

热门文章

  1. Ansible Notes: Tower Credential的本质
  2. python学习-Day23
  3. screen使用小结
  4. 面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了!
  5. 程序包 applets.user.service.UserService 不存在-2022新项目
  6. 是时候使用 YAML 来做配置或数据文件了
  7. API 工程化分享
  8. HMS Core使能AI智慧体验,共建创新应用生态
  9. Fail2ban 配置详解 监禁配置(jail.conf)
  10. MongoDB 分片规则