[英]Accessing Database in Multithreaded Environment in Java
I am trying to understand approaches to access a database in a Multi threaded environment. 我试图了解在多线程环境中访问数据库的方法。
I implemented a following spring example that queries object from database in multiple threads, it works fine but I am not to sure if this is the right way to do it. 我实现了一个以下spring例子,它在多个线程中从数据库查询对象,它工作正常,但我不确定这是否是正确的方法。
database.xml
file looks like this database.xml
文件如下所示
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1522/orcl.168.0.106" />
<property name="username" value="system" />
<property name="password" value="admin" />
</bean>
<bean id="oracleJDBCTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name = "dataSource" ref = "dataSource" />
</bean>
</beans>
UserDetails
object UserDetails
对象
package com.dataReader;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class UserDetails implements RowMapper {
private String user_name;
private String password;
public String getUser_name() {
return user_name;
}
public void setUser_name(String username) {
this.user_name = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
UserDetails userDetails = new UserDetails();
userDetails.setUser_name(rs.getString("USER_NAME"));
userDetails.setPassword(rs.getString("PASSWORD"));
return userDetails;
}
}
Application
class is as follows Application
类如下
package com.dataReader;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
public class Application {
static JdbcTemplate oracleJDBCTemplate;
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("database.xml");
oracleJDBCTemplate = (JdbcTemplate) context.getBean("oracleJDBCTemplate");
List<String> userList = new ArrayList<String>();
userList.add("system");
userList.add("user-1");
userList.add("user-2");
userList.add("user-10");
userList.add("user-12");
for(int i=0;i<userList.size();i++) {
RunnerData runnerData = new RunnerData(oracleJDBCTemplate,userList.get(i));
Thread thread = new Thread(runnerData);
thread.start();
}
}
}
class RunnerData implements Runnable{
private JdbcTemplate oracleJDBCTemplate;
private String username;
RunnerData(JdbcTemplate jdbcTemplate,String username){
this.oracleJDBCTemplate=jdbcTemplate;
this.username=username;
}
@Override
public void run() {
UserDetails userDetails= oracleJDBCTemplate.queryForObject("select user_name,password from User_details where user_name=?",
new Object[] {username},BeanPropertyRowMapper.newInstance(UserDetails.class));
System.out.println(userDetails.getUser_name()+" "+userDetails.getPassword());
}
}
Is that a right approach to access database in a multi-threaded environment especially where we have large number of threads accessing database? 这是在多线程环境中访问数据库的正确方法,特别是在我们有大量线程访问数据库的情况下吗? Wouldn't JdbcTemplate lock the database while querying the object.
在查询对象时,JdbcTemplate不会锁定数据库。 What are your experience in designing & implementing such a scenario?
您在设计和实施此类方案方面有哪些经验?
Thanks for your input on this. 感谢您对此的意见。
You would use database connection pooling. 您将使用数据库连接池。 Using Oracle connection pooling from OJDBC library is one way, for example:
使用OJDBC库中的Oracle连接池是一种方法,例如:
<bean id="datasource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="connectionCachingEnabled" value="true" />
<property name="url" value="jdbc:oracle:thin:@localhost:1522/orcl.168.0.106" />
<property name="username" value="system" />
<property name="password" value="admin" />
<property name="connectionCacheProperties">
<props merge="default">
<prop key="MinLimit>5</prop>
<prop key="MaxLimit">100</prop>
</props>
</property>
</bean>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.