我有 Controller 、服务和 dao 类单例
道类:
@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 类中,我使用 JdbcTemplate,它被定义为单例,并且 dataSource bean 也是单例。
现在我有以下疑问:
1)如果我的 JdbcTemplate 是单例且 dataSource bean 是单例,它们会导致并发请求出现问题吗?
2)这是制作 JdbcTemplate bean 并注入(inject) DAo 的理想方法吗?
3)请求范围是否只应在任何类保存实例变量时才存在?
最佳答案
为了能够同时针对您的数据库工作,我建议您使用连接池。
当多个请求同时“到达”时,连接池将为每个请求分配一个专用连接来处理数据库。
当然,您有责任确保您没有访问数据库中的同一“区域”。
在 MySql DB 中,我知道有针对此类场景的锁定机制,但我建议进行更深入的研究。
有2个众所周知的连接池:
- Apache DBCP http://commons.apache.org/proper/commons-dbcp/
- c3po http://www.mchange.com/projects/c3p0/
更详细的解释:
连接池
这种技术允许多个客户端使用一组缓存的共享且可重用的连接对象来提供对数据库的访问。
打开/关闭数据库连接是一个昂贵的过程,因此连接池提高了我们在池中维护连接对象的数据库上执行命令的性能。
它有助于重用同一连接对象来服务多个客户端请求。
每次收到客户端请求时,都会在池中搜索可用的连接对象,并且很有可能获得空闲的连接对象。
否则,要么将对传入请求进行排队,要么创建新的连接对象并将其添加到池中(取决于池中已有连接数以及特定实现和配置可以支持的连接数)。
一旦请求使用连接对象完成,该对象就会返回到池中,并从该池中将其分配给排队的请求之一(基于特定连接池实现为排队请求提供服务所遵循的调度算法)。
关于java - 如何实现DB并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39338186/