Доступ к базе данных в многопоточной среде на Java - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь понять подходы к доступу к базе данных в многопоточной среде.

Я реализовал следующий весенний пример, который запрашивает объект из базы данных в нескольких потоках, он работает нормально, но я не уверен, является ли это правильным способом сделать это.

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 блокировать базу данных при запросе объекта.Каков ваш опыт в разработке и реализации такого сценария?

Спасибо за ваш вклад в это.

1 Ответ

0 голосов
/ 05 июня 2019

Вы бы использовали пул соединений с базой данных.Использование пула соединений Oracle из библиотеки OJDBC - это один из способов, например:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...