MySql:多线程 JdbcTemplate 抛出 NullPointerException

MySql : Multi-Threaded JdbcTemplate is throwing a NullPointerException

jdbctemplate 在多线程环境中抛出错误。

我正在使用 jdbctemplate 将数据插入 MySql dB。 我正在向 jdbcTemplate.batchUpdate 发送用户对象列表。可以看到 DbDAO 构造函数和 运行() 方法中的值,但是 jdbcTemplate.batchUpdate 抛出空指针异常。

@Repository
public class DbDAO implements Runnable {

@Qualifier("jdbcDb")
@Autowired
JdbcTemplate jdbcTemplate;

public String query;
public ArrayList<User> users;

public DbDAO() {
}

public DbDAO(final String query, final ArrayList<User> users) {
    this.query = query;
    this.users = (ArrayList<User>) users.clone();
    System.out.println("## In DbDAO Constructor ##\n" + "Query: " + query + " Users: " + users.toString());
}

@Override
public void run() {
    System.out.println(
            Thread.currentThread().getId() + " In run **\n" + "Query: " + query + " Users: " + users.toString());

    try {
        jdbcTemplate.batchUpdate(query, new BatchPreparedStatementSetter() {

            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {

                User user = users.get(i);
                ps.setLong(2, user.getUserId());
                ps.setString(3, user.getUserName());
                ps.setString(4, user.getUserAddress());

            }

            @Override
            public int getBatchSize() {
                return users.size();
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

异常

Query: insert into users (id, name, address) values (?, ?, ?) Users: 
[User [userName=Name, userId=81, userAddress=Address], User 
[userName=Name, userId=82, userAddress=Address], User [userName=Name, 
userId=83, userAddress=Address], User [userName=Name, userId=84, 
userAddress=Address] ]
at com.ronan.DbDAO.run(DbDAO.java:52)
at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at 
java.util.concurrent.ThreadPoolExecutor.runWorker 
(ThreadPoolExecutor.java:1149)
at  
java.util.concurrent.ThreadPoolExecutor$Worker.run 
(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
java.lang.NullPointerException
at com.ronan.DbDAO.run(DbDAO.java:52)
at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)

找出问题所在,稍后回来。只是想post这个答案,这样它可能对某人有用。

问题出在数据源配置上。固定那个。 :

@Bean(name="dbone")
public DataSource createDbDatasource() {
DriverManagerDataSource dataSource = new 
DriverManagerDataSource();
dataSource.setUrl(datasourceOneUrl);
return dataSource;
}

@Bean(name="jdbcDb")
@Autowired
public JdbcTemplate createJdbcTemplate(@Qualifier("dbone") 
DataSource dbOneDS) {
        return new JdbcTemplate(dbOneDS);
}