如何实现DB并发?
How to achieve DB concurrency?
我有控制器、服务和 dao class 单例
道Class:
@Autowired
JdbcTemplate jdbcTemplate;
@Override
public String addUsers(UserDTO userDto) throws Exception {
// TODO Auto-generated method stub
System.out.println("JDBC TEMPLATE::"+jdbcTemplate);
String query="Insert into users values('"+userDto.getUserName()+"')";
System.out.println(query);
jdbcTemplate.update(query);
return "success";
}
applicationContext.xml
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/demo" />
<property name="username" value="" />
<property name="password" value="" />
</bean>
在dao中class我使用的是JdbcTemplate,它被定义为单例,dataSource bean也是单例。
现在我有以下疑问:
1)如果我的JdbcTemplate是单例的,dataSource bean是单例的,它们会导致并发请求有问题吗?
2)这是制作 JdbcTemplate bean 并注入到 DAo 的理想方式吗?
3)请求范围是否应该只存在于 class 持有实例变量的情况下?
为了能够与您的数据库并发工作,我建议您使用连接池。
当多个请求"arrive"并发时,连接池将为每个请求分配一个专用连接来处理数据库。
当然,您有责任确保您没有访问数据库中的相同 "area"。
在MySql DB中我知道有针对这种情况的锁定机制,但我建议进行更深入的研究。
有2个众所周知的连接池:
- Apache DBCP http://commons.apache.org/proper/commons-dbcp/
- c3pohttp://www.mchange.com/projects/c3p0/
更详细的解释:
连接池
这是一种允许多个客户端使用一组缓存的共享和可重用连接对象来提供对数据库的访问的技术。
Opening/Closing 数据库连接是一个昂贵的过程,因此连接池提高了我们在池中维护连接对象的数据库上执行命令的性能。
它有助于重复使用同一个连接对象来为多个客户端请求提供服务。
每次收到客户端请求时,都会在池中搜索可用的连接对象,并且很有可能获得空闲的连接对象。
否则,要么将传入的请求排队,要么创建一个新的连接对象并将其添加到池中(取决于池中已有的连接数以及特定实现和配置可以支持的连接数)。
一旦请求完成使用连接对象,该对象就会从分配给其中一个排队请求的地方返回到池中(基于特定连接池实现为服务排队请求所遵循的调度算法).
我有控制器、服务和 dao class 单例
道Class:
@Autowired
JdbcTemplate jdbcTemplate;
@Override
public String addUsers(UserDTO userDto) throws Exception {
// TODO Auto-generated method stub
System.out.println("JDBC TEMPLATE::"+jdbcTemplate);
String query="Insert into users values('"+userDto.getUserName()+"')";
System.out.println(query);
jdbcTemplate.update(query);
return "success";
}
applicationContext.xml
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/demo" />
<property name="username" value="" />
<property name="password" value="" />
</bean>
在dao中class我使用的是JdbcTemplate,它被定义为单例,dataSource bean也是单例。
现在我有以下疑问:
1)如果我的JdbcTemplate是单例的,dataSource bean是单例的,它们会导致并发请求有问题吗?
2)这是制作 JdbcTemplate bean 并注入到 DAo 的理想方式吗?
3)请求范围是否应该只存在于 class 持有实例变量的情况下?
为了能够与您的数据库并发工作,我建议您使用连接池。
当多个请求"arrive"并发时,连接池将为每个请求分配一个专用连接来处理数据库。
当然,您有责任确保您没有访问数据库中的相同 "area"。
在MySql DB中我知道有针对这种情况的锁定机制,但我建议进行更深入的研究。
有2个众所周知的连接池:
- Apache DBCP http://commons.apache.org/proper/commons-dbcp/
- c3pohttp://www.mchange.com/projects/c3p0/
更详细的解释:
连接池
这是一种允许多个客户端使用一组缓存的共享和可重用连接对象来提供对数据库的访问的技术。
Opening/Closing 数据库连接是一个昂贵的过程,因此连接池提高了我们在池中维护连接对象的数据库上执行命令的性能。
它有助于重复使用同一个连接对象来为多个客户端请求提供服务。
每次收到客户端请求时,都会在池中搜索可用的连接对象,并且很有可能获得空闲的连接对象。
否则,要么将传入的请求排队,要么创建一个新的连接对象并将其添加到池中(取决于池中已有的连接数以及特定实现和配置可以支持的连接数)。
一旦请求完成使用连接对象,该对象就会从分配给其中一个排队请求的地方返回到池中(基于特定连接池实现为服务排队请求所遵循的调度算法).