`
QING____
  • 浏览: 2245837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC中Connection解惑

    博客分类:
  • JAVA
 
阅读更多

 关于JDBC中关于Connection的两个疑问:

 

1.Connection实例是线程安全的吗?

    即一个connection实例,在多线程环境中是否可以确保数据操作是安全的?

private static Connection connection;

    上述代码,设计会不会有问题? 一个Connection实例,即对应底层一个TCP链接,有些开发者可能考虑到"性能",就将代码写成上述样式,最终一个application中所有的DB操作,使用一个connection.确实减少了与DB的TCP链接个数,但是这真的安全吗??真的提升了性能了吗??

    1) 似乎一个初学者都不会这些写,因为没有sample是这么展示的.但是往往会在每个方法调用时都新建connection,然后close();

    2) 当一个开发者考虑到性能的时候,可能会写出上面的代码..

 

    Connection不是线程安全的,它在多线程环境中使用时,会导致数据操作的错乱,特别是有事务的情况.connection.commit()方法就是提交事务,你可以想象,在多线程环境中,线程A开启了事务,然后线程B却意外的commit,这该是个多么纠结的情况.

    如果在没有事务的情况下,且仅仅是简单的SQL Select操作,似乎在不会出现数据错乱,一切看起来比较安全.但是这并非意味着提升了性能,JDBC的各种实现中,connection的各种操作都进行了同步:

##PreparedStatement
public int executeUpdate(){
	synchronized(connection){
		//do	
	}
}

同时只有当DB操作完成之后,方法调用才会返回. 尽管connection实例的个数唯一,但是在并发环境中,connection实例上锁竞争是必然的,反而没有提升性能(并发量).通常情况下,一个Connection实例只会在一个线程中使用,使用完之后close().

    TCP链接的创建开支是昂贵的,当然DB server所能承载的TCP并发连接数也是有限制的.因此每次调用都创建一个Connection,这是不现实的;所以才有了数据库连接池的出现.

    数据库连接池中保持了一定数量的connection实例,当需要DB操作的时候"borrow"一个出来,使用结束之后"return"到连接池中,多线程环境中,连接池中的connection实例交替性的被多个线程使用.

 

2. 在使用dataSourcePool的情况下,一个线程中所有的DB操作使用的是同一个connection吗??

    比如线程A,依次调用了2个方法,每个方法都进行了一次select操作,那么这两个select操作是使用同一个connection吗?

    第一感觉就是: dataSourcePool本身是否使用了threadLocal来保存线程与connection实例的引用关系;如果使用了threadLocal,那么一个线程多次从pool中获取是同一个connection,直到线程消亡或者调用向pool归还资源..

    如果在spring环境中(或者其他ORM框架中),这个问题需要分2种情况:事务与非事务.

    在非事务场景下(同时也没有使用spring的事务管理器),一切都很简单,每一次调用,都是从pool中取出一个connection实例,调用完毕之后归还资源,因此多次调用,应该是不同的connection实例.

public List<Object> select(String sql){
	Connection connection = pool.getConnection();
	//do
	pool.release(connection);//归还资源
}

 

    在使用事务的场景下(或者使用spring事务管理器:TransactionManager,AOP等),情况就有所不同,开启一个新事务的同时,就会冲pool中获取一个connection实例,并将transaction和connection互为绑定,即此transaction中只会使用此connection,此connection此时只会在一个transaction中使用;因此,在此事务中,无论操作了多少次DB,事实上只会是一个connection实例,直到事务提交或者回滚,当事务提交或者回滚时,将会解除transaction与connection的绑定关系,同时将connection归还到pool中.

//开启事务
public TransactionHolder transaction(){
	Connection connection = pool.getConnection();
	connection.setAutoCommit(false);
	return new TransactionHolder(connection);
}

//执行sql
public boolean insert(String sql,TransactionHolder holder){
	Connection connection = holder.getConnection();
	//do
	try{
		//doInsert
		return true;
	}catch(Exception e){
		holder.setRollback(true);
	}
	return false;
}

//提交事务
public void commit(TransactionHolder holder){
	Connection connection = holder.getConnection();
	connection.commit();
	holder.unbind();//解除绑定
	pool.release(connection);//归还资源	
}

    在有事务的情况上,伪代码可能就像上述例子.对于跨DB分布式事务,可能更加的复杂. 

分享到:
评论
2 楼 bill_hai1 2018-02-06  
1 楼 hao_foo 2015-02-09  
 

相关推荐

    jdbc-mysql-connection

    标题中的"jdbc-mysql-connection"关键词表明我们讨论的主题是关于Java数据库连接(JDBC)与MySQL数据库之间的交互。JDBC是Java平台上的一个标准接口,它允许Java应用程序与各种类型的数据库进行通信,包括MySQL。...

    JdbcConnection

    在IT行业中,JDBCConnection是Java数据库连接(Java Database Connectivity)的一个重要概念,它是Java程序与各种数据库进行交互的基础。本项目"JdbcConnection"利用了JDBC API,结合Servlet和Tomcat服务器,以及...

    JDBC Connection Configuration.rar

    在提供的"JDBC Connection Configuration.jmx"文件中,很可能是一个基于Apache JMeter的测试计划,用于模拟用户对JDBC连接的配置和性能测试。JMeter允许设置数据库连接池参数,执行SQL查询,并分析响应时间和资源...

    c3p0 - JDBC3 Connection and Statement Pooling

    关于jdbc连接池的一个第三方类 可以实现连接池的使用

    jdbc Connection test

    在IT行业中,JDBC(Java Database Connectivity)是Java语言中用于与各种数据库进行交互的一组接口和类。本文将深入探讨如何使用Eclipse IDE来连接MySQL-Front数据库,并实现数据表的插入和删除操作。 首先,我们...

    JDBC-Connection.docx

    在`getConnection`方法中,采用了更灵活的方式读取配置文件`jdbc.properties`,从中获取数据库连接信息: 1. 使用`getClass().getClassLoader().getResourceAsStream()`加载类路径下的`jdbc.properties`文件,然后...

    jdbc connection

    Java Database Connectivity (JDBC) 是Java平台中用于与各种数据库进行交互的标准API。它是由Sun Microsystems(现为Oracle公司)开发并维护的,允许Java应用程序通过编写Java代码来访问和处理数据库数据。JDBC是...

    mysql——connection -jdbc

    总结,"mysql——connection -jdbc"涉及的主要知识点包括:MySQL数据库的使用,JDBC API,连接MySQL的步骤,处理异常,创建和执行SQL语句,处理结果集,以及ODBC数据源和其在Windows环境中的配置。这些都是Java...

    JDBCconnection.java 代码

    在 `main` 方法中,创建了一个 `JDBCconnection` 实例,并调用 `creatConnection` 方法创建数据库连接。然后,执行一条查询语句,获取结果集并遍历输出每一行的 `adminid` 字段。最后,调用 `closeConnection` 方法...

    JDBC方式连接DB所需要的JAR包

    在Java编程环境中,JDBC(Java Database Connectivity)是Java应用程序与各种数据库进行交互的标准接口。JDBC提供了一套API,使得开发人员能够编写数据库独立的代码,实现对数据的增删改查操作。为了实现JDBC连接,...

    sql.rar_MySQLConnection_sqljdbc4-3.0.jar

    标题中的"sql.rar_MySQLConnection_sqljdbc4-3.0.jar"暗示了这是一个与SQL数据库连接相关的资源包,特别是涉及到MySQL和SQL Server的连接。其中,“MySQLConnection”指的是Java程序连接MySQL数据库的方式,而“sql...

    JDBC Connection Pool org.apache.tomcat.jdbc.pool

    apache出品,用来取代老旧的dbcp

    Weblogic JDBC 数据源配置和详细参数说明

    要创建一个 JDBC 连接池,在 Administration Console 中右击 JDBC&gt;Connection Pools 节点,然后选择 Configure a new JDBC Connection Pool。这将显示一个 Configure a JDBC Connection Pool 画面。为 Oracle 数据库...

    JDBC代码JDBC代码JDBC代码

    Java Database Connectivity(JDBC)是Java编程语言中用于与各种数据库进行交互的一种API。它为开发者提供了一种标准的方法,使他们能够用SQL语句来访问和操作数据库。本篇文章将深入探讨JDBC的核心概念、步骤以及...

    jdbc jdbc jdbc

    Java Database Connectivity(JDBC)是Java编程语言中用于与各种数据库进行交互的一种标准接口。它由Sun Microsystems(现为Oracle公司)开发并定义,作为Java平台的一部分,允许Java应用程序通过编写Java代码来访问...

    sqljdbc和sqljdbc4 sqlserver最新驱动

    - 建立连接:`Connection conn = DriverManager.getConnection("jdbc:sqlserver://服务器地址:端口;databaseName=数据库名", "用户名", "密码");` - 创建Statement或PreparedStatement对象,用于执行SQL语句。 - ...

    JDBCConnection

    在Java编程中,当你需要执行SQL语句或者管理数据库事务时,通常会通过JDBCConnection对象来实现。这个接口提供了对数据库的各种操作,包括建立连接、执行SQL、处理结果集以及管理事务等。 ### JDBC基础 JDBC是Java...

    JDBC调DB2存储过程

    在Java开发过程中,经常需要通过JDBC(Java Database Connectivity)技术来访问数据库中的数据。本篇文章将详细介绍如何利用JDBC调用DB2数据库中的存储过程,并对代码进行逐行解析,帮助读者更好地理解和掌握这一...

    java jdbc数据库连接

    Java JDBC(Java Database Connectivity)是Java平台中用于与各种数据库进行交互的一组接口和类,它是Java标准的一部分,属于Java的API。JDBC提供了一种标准化的方法,使得开发者能够使用SQL语言来访问和操作数据库...

Global site tag (gtag.js) - Google Analytics