Re: NPE in DBCP when attempting to connect to a database that doesn't exist

2019-10-10 Thread Christopher Schultz
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA256

Adam,

On 10/9/19 20:59, Adam Rauch wrote:
> When attempting to connect to a DataSource that specifies a
> database that doesn't exist, Tomcat 8.5.46 throws an informative
> SQLException; for example: java.sql.SQLException: Cannot create
> PoolableConnectionFactory (FATAL: database "labkey19.3" does not
> exist)
>
> In the same situation, Tomcat 7.0.96 throws a NullPointerException
> with no useful information.
>
> I expect an exception, but the 8.5.46/DBCP2 behavior is obviously
> preferable, since it gives administrators a better understanding
> of what's gone wrong. Seems like a DBCP 1.x bug (not a Tomcat bug)
> and I wouldn't consider it a high priority to fix (our product
> recovers just fine in either case and we recommend Tomcat 9.0.x
> these days), but the discrepancy seemed worth mentioning here.
>
> Full stack traces below. Our code is simply:
>
> try (Connection conn = dataSource.getConnection()) { ... }
>
> Thanks, Adam

Sounds like a bona-fide bug. Can you please file this in Bugzilla?

- -chris

>
> Tomcat 7.0.96
>
> java.lang.NullPointerException at
> org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory.destroyObject(Po
olableConnectionFactory.java:643)
>
>  at
> org.apache.tomcat.dbcp.dbcp.BasicDataSource.validateConnectionFactory(
BasicDataSource.java:1738)
>
>  at
> org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFa
ctory(BasicDataSource.java:1721)
>
>  at
> org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicData
Source.java:1486)
>
>  at
> org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSou
rce.java:1103)
>
>  at org.labkey.api.data.DbScope.(DbScope.java:337) at
> org.labkey.api.data.DbScope.addScope(DbScope.java:1275) at
> org.labkey.api.data.DbScope.initializeScopes(DbScope.java:1243) at
> org.labkey.api.module.ModuleLoader.initializeDataSources(ModuleLoader.
java:1004)
>
>  at
> org.labkey.api.module.ModuleLoader.doInit(ModuleLoader.java:352) at
> org.labkey.api.module.ModuleLoader.init(ModuleLoader.java:249) at
> org.apache.catalina.core.ApplicationFilterConfig.initFilter(Applicatio
nFilterConfig.java:285)
>
>  at
> org.apache.catalina.core.ApplicationFilterConfig.getFilter(Application
FilterConfig.java:266)
>
>  at
> org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFil
terConfig.java:108)
>
>  at
> org.apache.catalina.core.StandardContext.filterStart(StandardContext.j
ava:5037)
>
>  at
> org.apache.catalina.core.StandardContext.startInternal(StandardContext
.java:5739)
>
>  at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
>
>
at
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.
java:1018)
>
>  at
> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994
)
>
>
at
> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:662)
>
>
at
> org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.jav
a:712)
>
>  at
> org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig
.java:2002)
>
>  at
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executor
s.java:515)
>
>  at
> java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.jav
a:264)
>
>  at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
> at
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPool
Executor.java:1128)
>
>  at
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoo
lExecutor.java:628)
>
>  at java.base/java.lang.Thread.run(Thread.java:830)
>
> Tomcat 8.5.46
>
> java.sql.SQLException: Cannot create PoolableConnectionFactory
> (FATAL: database "labkey19.3" does not exist) at
> org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionF
actory(BasicDataSource.java:669)
>
>  at
> org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDat
aSource.java:544)
>
>  at
> org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSo
urce.java:753)
>
>  at org.labkey.api.data.DbScope.(DbScope.java:337) at
> org.labkey.api.data.DbScope.addScope(DbScope.java:1275) at
> org.labkey.api.data.DbScope.initializeScopes(DbScope.java:1243) at
> org.labkey.api.module.ModuleLoader.initializeDataSources(ModuleLoader.
java:1004)
>
>  at
> org.labkey.api.module.ModuleLoader.doInit(ModuleLoader.java:352) at
> org.labkey.api.module.ModuleLoader.init(ModuleLoader.java:249) at
> org.apache.catalina.core.ApplicationFilterConfig.initFilter(Applicatio
nFilterConfig.java:283)
>
>  at
> org.apache.catalina.core.ApplicationFilterConfig.getFilter(Application
FilterConfig.java:264)
>
>  at
> org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFil
terConfig.java:108)
>
>  at
> org.apache.catalina.core.StandardContext.filterStart(StandardContext.j
ava:4546)
>
>  at
> org.apache.catalina.core.StandardContext.startInternal(StandardContext
.java:5191)
>
>  at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>
>
at
> org.a

NPE in DBCP when attempting to connect to a database that doesn't exist

2019-10-09 Thread Adam Rauch
When attempting to connect to a DataSource that specifies a database 
that doesn't exist, Tomcat 8.5.46 throws an informative SQLException; 
for example: java.sql.SQLException: Cannot create 
PoolableConnectionFactory (FATAL: database "labkey19.3" does not exist)


In the same situation, Tomcat 7.0.96 throws a NullPointerException with 
no useful information.


I expect an exception, but the 8.5.46/DBCP2 behavior is obviously 
preferable, since it gives administrators a better understanding of 
what's gone wrong. Seems like a DBCP 1.x bug (not a Tomcat bug) and I 
wouldn't consider it a high priority to fix (our product recovers just 
fine in either case and we recommend Tomcat 9.0.x these days), but the 
discrepancy seemed worth mentioning here.


Full stack traces below. Our code is simply:

    try (Connection conn = dataSource.getConnection())
    {
    ...
    }

Thanks,
Adam


Tomcat 7.0.96

java.lang.NullPointerException
    at 
org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory.destroyObject(PoolableConnectionFactory.java:643)
    at 
org.apache.tomcat.dbcp.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1738)
    at 
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1721)
    at 
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1486)
    at 
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1103)

    at org.labkey.api.data.DbScope.(DbScope.java:337)
    at org.labkey.api.data.DbScope.addScope(DbScope.java:1275)
    at org.labkey.api.data.DbScope.initializeScopes(DbScope.java:1243)
    at 
org.labkey.api.module.ModuleLoader.initializeDataSources(ModuleLoader.java:1004)

    at org.labkey.api.module.ModuleLoader.doInit(ModuleLoader.java:352)
    at org.labkey.api.module.ModuleLoader.init(ModuleLoader.java:249)
    at 
org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285)
    at 
org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:266)
    at 
org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:108)
    at 
org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:5037)
    at 
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5739)

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at 
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1018)
    at 
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994)
    at 
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:662)
    at 
org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:712)
    at 
org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:2002)
    at 
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at 
java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)

    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
    at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)

    at java.base/java.lang.Thread.run(Thread.java:830)

Tomcat 8.5.46

java.sql.SQLException: Cannot create PoolableConnectionFactory (FATAL: 
database "labkey19.3" does not exist)
    at 
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:669)
    at 
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:544)
    at 
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:753)

    at org.labkey.api.data.DbScope.(DbScope.java:337)
    at org.labkey.api.data.DbScope.addScope(DbScope.java:1275)
    at org.labkey.api.data.DbScope.initializeScopes(DbScope.java:1243)
    at 
org.labkey.api.module.ModuleLoader.initializeDataSources(ModuleLoader.java:1004)

    at org.labkey.api.module.ModuleLoader.doInit(ModuleLoader.java:352)
    at org.labkey.api.module.ModuleLoader.init(ModuleLoader.java:249)
    at 
org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:283)
    at 
org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:264)
    at 
org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:108)
    at 
org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4546)
    at 
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5191)

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at 
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
    at 
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
    at 
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
    at