【问题标题】:One DAO access for each request每个请求一个 DAO 访问权限
【发布时间】:2015-05-09 19:46:16
【问题描述】:

对于到达 REST api 的每个请求,我必须实现对数据库的一次数据访问(CRUD 调用)。使它成为线程安全实现的最佳方法是什么。 目前,对于 REST api,我有一个请求进来。我可以将它添加到队列中。并返回。我可以创建一个从队列中轮询的消费者线程。 但是,我将不胜感激有关如何使用线程安全的消费者线程对请求进行数据库访问的任何见解。我正在使用 spring 进行 DAO 访问。这是我的 DAO 课程。

package dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Service;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import com.mysql.jdbc.PreparedStatement;

public class UserDAOImpl extends JdbcDaoSupport implements UserDAO 
{


    @Autowired
    private DriverManagerDataSource datasource;

private void setDataSource(DriverManagerDataSource datasource)
    {
        this.datasource = datasource;
    }

    @Override
      public List<User> getUsers(String userid) {
        //String query;
        String database_name="tennis.";
        String sql = " select distinct ux.id as user_id , ux.first_name, ux.last_name , lvl.rating as rating , photo.filename as file_name"+
                 "  from mytable.user as ux, "+database_name+"profile as pf , "+database_name+"level as lvl, mytable.photo as photo "+
                 "  where "+
                 "  ux.id = pf.user_id  "+
                 "  and ux.id = photo.user_id"+
                 "  and pf.level_id = lvl.id"+
                 "  and ux.id in "+
                 "  (  select  distinct user_id from "+database_name+"profile "+ 
                 "    where "+database_name+"profile.level_id in "+ 
                 "    (select l.id as levelid  "+
                 "  from "+database_name+"level as l "+
                 "  where l.rating  between "+
                 "  ( ( select distinct level.rating "+
                 "      from  "+database_name+"level, "+database_name+"profile "+
                 "      where level.id = profile.level_id and profile.user_id = ?) -?)  "+
                 "  and  "+
                 "    ( ( select distinct level.rating "+
                 "      from  "+database_name+"level, "+database_name+"profile "+
                 "      where level.id = profile.level_id "+
                 "      and profile.user_id = ?)+?) )) ";

        PreparedStatementSetter ps2 = new PreparedStatementSetter() {
        @Override   
        public void setValues(java.sql.PreparedStatement ps) throws SQLException {
            ps.setString(1, userid);
            ps.setInt(2, 1);
            ps.setString(3, userid);
            ps.setInt(4, 1);
        }

        };

        List<User> users = getJdbcTemplate().query(sql,ps2,new RowMapper<User>()
       {

              @Override
              public User mapRow(ResultSet rs, int rowNum) throws SQLException 
              {

                User user = new User();
                user.setUserid(rs.getString(1));
                user.setFirstName(rs.getString(2));
                user.setLastName(rs.getString(3));
                user.setRating( rs.getString(4));
                //user.setPhoto_file_path(rs.getString(5));
                return user;
              }});
        System.out.println(users.size());
      //  for(User user: users)
    //      System.out.println(user);
        return users;

      }

}

【问题讨论】:

    标签: java multithreading jdbc dao


    【解决方案1】:

    目前尚不清楚您对线程安全的具体关注是什么,但如果一个对象没有状态,根据定义,它就是线程安全的。

    我可以在上面包含的 dao 实现中看到的唯一状态是注入的数据源,只要在 spring 的线程级别正确管理事务和连接,数据源本身就应该是线程安全的。

    如果您无法通过定义 ProviderCreatingFactoryBean 使您的 dao 原型限定范围并使用 java.inject.Provider 注入它。但是,这会对性能产生一些影响。

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      相关资源
      最近更新 更多