Я пытаюсь понять подходы к доступу к базе данных в многопоточной среде.
Я реализовал следующий весенний пример, который запрашивает объект из базы данных в нескольких потоках, он работает нормально, но я не уверен, является ли это правильным способом сделать это.
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
объект
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
класс выглядит следующим образом
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());
}
}
Это правильный подход для доступа к базе данных в многопоточной среде, особенно там, где у нас большое количество потоков, обращающихся к базе данных?Не будет ли JdbcTemplate блокировать базу данных при запросе объекта.Каков ваш опыт в разработке и реализации такого сценария?
Спасибо за ваш вклад в это.