Jetty 8.1.0 和 BTM 的数据库异常

Val*_*uri 5 postgresql

我们正在使用 BTM 2.1.2 运行 Jetty 8.1.0。

我们使用 Postgres 作为我们的数据库。

一切都很好,除了当我们在某个表的主要=空的条件下运行任何查询时,服务器会失去与数据库的连接。以下是我们看到的异常:

org.postgresql.util.PSQLException:错误:整数的无效输入语法:“null”
at
...
...长堆栈转储随之而来...
...
2012 年 6 月 15 日下午 12:20:19 org.eclipse。 jetty.server.AsyncHttpConnection 句柄信息:EndPoint 不长进度:stack 100dump SCEP@162b333{l(/74.93.245.209:60506)<->r(/10ensues.99.21.87:80),d=true,open=true ,ishut=false,oshut=false,rb=false,wb=false,w=false,i=5r}-{AsyncHttpConnection@18fc7ca,g=HttpGenerator{s=3,h=-1,b=20909,c= -1},p=HttpParser{s=0,l=16,c=0},r=1} AsyncHttpConnection@18fc7ca,g=HttpGenerator{s=3,h=-1,b=20909,c=-1 },p=HttpParser{s=0,l=16,c=0},r=1 2012 年 6 月 15 日下午 12:20:19
org.eclipse.jetty.server.AsyncHttpConnection 句柄警告:关闭端点没有任何进展:200 SCEP@162b333{l(/74.93.245.209:60506)<->r(/10.99.21.87:80),d=true,open =true,ishut=false,oshut=false,rb=false,wb=false,w=false,i=5r}-{AsyncHttpConnection@18fc7ca,g=HttpGenerator{s=3

此事件后的任何查询均会因以下异常而中断

它发生在我们的生产服务器上!是什么导致了这个问题?

更新:

这是代码!

我知道我们不应该使用 primarykey = null 查询,因为 primary 永远不能为 null。但是它的参数和空验证被遗漏了!

令人惊讶的是,Jetty 6 与它配合得很好!即使在运行此查询之后,它也完全没有问题。它只是 Jetty 8-1-0,在运行此类查询时永久丢失数据库连接。直到我重新启动服务器

String query = "select * from table where primarykey="+parameter; 
Statement lStatement   = null;  
Connection lConnection  = null;  
ResultSet lResultSet   = null;  
try  {
   lConnection = DBAccess.getConnection();   
   lStatement  = lConnection.createStatement();
   lResultSet  =  lStatement.executeQuery( query );     
   while ( lResultSet.next() )    {
       mLogger.info("The result set is : "+lResultSet.toString());    
   }
}  catch( Exception e )  {   
    e.printStackTrace();   
    mLogger.error("Exception occurred while trying to runQuery : "+e.getMessage());  
}  finally  {   
    DBAccess.closeResultSet( lResultSet );   
    DBAccess.closeStatement( lStatement );   
    DBAccess.closeDBConnection( lConnection );  
}
Run Code Online (Sandbox Code Playgroud)

更新

有人可以帮我解决这个问题吗?我仍在寻找答案。我每天都在使用 Jetty 8-1-0 遇到不同的问题。

我删除了 Jetty.xml 中的事务管理配置并使用默认 JNDI 配置进行部署。有一段时间事情很顺利。

上周,服务器开始因“打开的文件太多”问题而哭泣。一旦我增加了可以在服务器上打开的文件数量,它就得到了修复。今天,Jetty 又因 OutOfMemoryError 死了。这里值得注意的是内存泄漏发生在“Too May Open Files”错误发生的同一个地方。我猜它是导致问题的 HTTPClient 。(好吧,我会在 stackoverflow 中发布相同的内容。我认为这不是 DBA 问题。但所有这些都是从同一个地方开始的。所以,如果有意义的话,我想在这里记录下来。

gra*_*emp 1

看起来变量null中的parameter是单引号的,例如'null'。在 SQL 查询上下文中,空值不带引号。

事情应该是这样的:

=# select 1 from t where i = null;
 ?column? 
----------
(0 rows)
Run Code Online (Sandbox Code Playgroud)

这就是你所拥有的:

=# select 1 from t where i = 'null';
ERROR:  invalid input syntax for integer: "null"
LINE 2: select 1 from t where i = 'null';
Run Code Online (Sandbox Code Playgroud)

因此,您要么需要从parameter变量中删除任何引号,要么使用与数据库适配器的参数绑定。第二种选择是更可取的。