我在Tomcat 8中运行的REST服务器应用程序(Jersey + ActiveJDBC + Shiro + TomcatJDBC)中遇到以下问题,数据库是PostgreSQL,它也在VPS中运行。
有时在通过REST应用程序进行大量/多次CRUD活动后,数据库中插入的数据不存在。
注意:我在ActiveJDBC中使用insert,因为我有自定义PK而不使用任何缓存。
例如:通过REST调用总数据时它会显示100,但是当直接检查数据库时它会显示80.然后,如果我重新启动Tomcat,REST将响应80,因此数据消失了......
我已经调试了所有可能的错误(Checked Tomcat Log,Postgresql Log和App log,还有VPS),但什么都没发现!插入的数据就像从未插入一样。
数据消失是偶尔发生的,我无法重现它。因此无法解决这个问题。
(以前编辑过,错误参考): 然后我发现这个Q& A: Hibernate not saving Object in the Database
是否有可能ActiveJDBC有如上所述的冲洗问题,因为像Q& A一样,它只发生在PostgreSQL上。
保存代码:
try(DB db = new DB()){
db.open(DataSourcePool.getInstance().ds_pooled);
dbModel dbModel = new dbModel();
dbModel.setPojoModel(PojoModel);
CheckRulesCreate(dbModel); //Bussines Rule Check, throw on Fail
if (dbModel.insert())
return Response.status(201).entity(new Outputs("OK",201,"Data saved!")).build();
}
数据源池:
//Singelton Based On Bill Pugh Singeltom Design
import org.apache.tomcat.jdbc.pool.DataSource;
DataSource ds = new DataSource();
ds.setDriverClassName("org.postgresql.Driver");
ds.setUrl("jdbc:postgresql://localhost/database");
ds.setUsername("blahblah");
ds.setPassword("hisshiss");
ds.setInitialSize(10);
ds.setMaxActive(300);
ds.setMinIdle(2);
ds.setValidationQuery("select 1");
ds.setTestOnBorrow(true);
ds.setRemoveAbandoned(true);
ds.setRemoveAbandonedTimeout(60);
ds.setMaxWait(10000);
ds.setName("DataSourcePool");
答案 0 :(得分:0)
ActiveJDBC不是那样的。如果您遇到类似问题,那么您的代码中就会出现错误。
在任何情况下,ActiveJDBC都是Pass-Through framework:当你调用任何CRUD方法时,框架会调用底层的JDBC。一个例外是Batch operations,但这是有意的。
如果您的应用程序工作了一年且没有问题,现在您确实遇到了问题,那么您需要查看更改的内容。