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);
}
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);
}