Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Spring предоставляет специальный источник данных, который позволяет вам делать это: SingleConnectionDataSource
Изменение кода на это должно помочь:
SingleConnectionDataSource dataSource = new SingleConnectionDataSource();
....
// The rest stays as is
Для использования в многопоточных приложениях вы можете повторно ввести код, заимствовав новое соединение из пула и обернув его вокруг части кода, интенсивно использующей базу данных:
// ... this code may be invoked in multiple threads simultaneously ...
try(Connection conn = dao.getDataSource().getConnection()) {
JdbcTemplate db = new JdbcTemplate(new SingleConnectionDataSource(conn, true));
// ... database-intensive code goes here ...
// ... this code also is safe to run simultaneously in multiple threads ...
// ... provided you are not creating new threads inside here
}
Вам нужно, чтобы вызовы были объединены в одну транзакцию. Обычно вы делаете это с аннотацией Spring AOP + @Transactional
в приложении. Вы также можете сделать это программно с помощью PlatformTranactionManager
, TransactionTemplate
и обернуть код для выполнения в TransactionCallback
. См. документацию по транзакции .