简体   繁体   English

在Java中访问多线程环境中的数据库

[英]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.

相关问题 在多线程环境中访问大型单例对象 - Accessing a large singleton object in multithreaded environment 多线程环境中带有数据库调用的应用程序设计 - Application Design with a database call in multithreaded environment 在 Java 多线程环境中分配唯一代理 - Assign Unique Proxy in a Multithreaded Environment in Java JAVA 同步块在多线程环境中不起作用 - JAVA synchronized block not working in a multithreaded environment Java:在多线程和事务性环境中运行DAO类 - Java: Running DAO class in multithreaded and transactional environment 对象创建是多线程环境中Java的瓶颈吗? - Is object creation a bottleneck in Java in multithreaded environment? Java的。在多线程环境中序列化对象 - Java. Serialization of objects in a multithreaded environment 如何在多线程环境中访问的Java列表中检测和处理冲突? - How to detect and handle collisions in java list accessed in multithreaded environment? 编写在多线程Java环境中更新两个对象的方法的最佳方法? - Best ways to write a method that updates two objects in a multithreaded java environment? 如何在多线程JAVA环境中保护对象而不损失性能? - How to protect an object in multithreaded JAVA environment without losing performance?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM