java为每个请求提供一个DAO访问
对于到达RESTAPI的每个请求,我必须实现对数据库的一次数据访问(CRUD调用)。实现线程安全的最佳方法是什么。 目前,对于RESTAPI,我收到了一个请求。我可以将它添加到队列中。然后返回。我可以创建一个消费者线程,从队列中进行轮询。 但是,如果您能深入了解如何使用线程安全的使用者线程对请求进行数据库访问,我将不胜感激。我使用spring访问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;
}
}
# 1 楼答案
目前尚不清楚您对线程安全的具体担忧是什么,但如果一个对象没有状态,根据定义,它是线程安全的
我在上面包含的dao实现中看到的唯一状态是注入的数据源,只要在spring中在线程级别正确管理事务和连接,数据源本身就应该是线程安全的
如果做不到这一点,您可以将dao原型设置为作用域,并使用java注入它。注射通过定义ProviderCreatingFactoryBean提供程序。然而,这会对性能产生一些影响