【问题标题】:Strange error in apache tomcat?apache tomcat中的奇怪错误?
【发布时间】:2014-08-03 20:36:33
【问题描述】:

我正在使用带有 eclipse keplee 的 apache tomcat。这是我的 jsp 文件,它运行一个 java 文件,该文件使用 sparql 从 tdb 查询。 jsp文件:

<%@ page import="check.test4query"  %>
            <% test4query demo = new test4query();
            test4query dem = new test4query();
            String[] id =new String[20];
            String[] dat =new String[20];
            int i;
           demo.mai("SELECT ?x WHERE { ?y <TO:> 'hjcooljohny75@gmail.com' . ?y <SUB:> ?x} LIMIT 20 ");
           for(i=0;i<20;i++)
           {   id[i]=test4query.arr[i];
               id[i] = id[i].substring(0, Math.min(id[i].length(), 30));
           }
 for(i=0;i<20;i++)
            { //id[i]=test4query.arr[i];
                out.println("<tr>"+"&nbsp&nbsp&nbsp&nbsp"+id[i]+"<hr style='border-color:#E6E6E6;padding:0px;margin:0px'>"+"</tr>");
            }   
            %>

这是我的 test4query:

public static String[] arr=new String[20];
public  void  mai (String s) {
    //String s;
    //load the dataset 
    //String query1; 
    //query1="hjcooljohny75@gmail.com";
    //query1 = (String)(subjectentry.getText());
      //  s="SELECT ?x WHERE { ?y <TO:> '"+query1+"' . ?y <SUB:> ?x} LIMIT 20 ";
        System.out.println(s);
    String directory = "EMAILADDRESS" ;
    Dataset ds = TDBFactory.createDataset(directory) ;
    Model model = ds.getDefaultModel() ;
   ds.begin(ReadWrite.READ) ;
     QueryExecution qExec = QueryExecutionFactory.create(s, ds) ;
     int i=0;
     try{
     ResultSet rs = qExec.execSelect() ;
   String x=rs.toString();



    while (rs.hasNext()) {
        QuerySolution qs = rs.next();
        String rds;
        if(qs.get("x")!=null)
        rds = qs.get("x").toString();
        else rds="hi";
       // String em = (String)rs.getString();
        if(rds==null)
            break;
        //System.out.println(rds);
       arr[i] = rds;
       i++;
       //for (int i =0; i < arr.length; i++){


   }
   } finally
    {qExec.close() ;
    ds.commit();
    ds.end();
   }
    for( i=0;i<20;i++)
        System.out.println(arr[i]);
    //arr[0]="hi";


// return arr;
         //   try { 


          //      ResultSetFormatter.out(rs) ;
           // } finally { qExec.close() ; }

        // Another query - same view of the data.

}

问题是当我启动 tomcat 服务器时,它运行完美,显示结果,但之后如果我刷新页面,它会显示错误:

com.hp.hpl.jena.tdb.transaction.TDBTransactionException: Not in a transaction
    com.hp.hpl.jena.tdb.transaction.DatasetGraphTransaction.get(DatasetGraphTransaction.java:106)
    com.hp.hpl.jena.tdb.transaction.DatasetGraphTransaction.get(DatasetGraphTransaction.java:40)
    com.hp.hpl.jena.sparql.core.DatasetGraphTrackActive.getDefaultGraph(DatasetGraphTrackActive.java:91)
    com.hp.hpl.jena.sparql.core.DatasetImpl.getDefaultModel(DatasetImpl.java:103)
    check.test4query.mai(test4query.java:59)
    org.apache.jsp.grayscale.gmail_005flike_jsp._jspService(gmail_005flike_jsp.java:210)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:403)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:347)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

这种情况一直都在发生,但是当我重新启动服务器时,它第一次显示正确的ans,然后出现错误。我不知道是什么问题以及如何纠正它??

【问题讨论】:

    标签: java jsp tomcat sparql tdb


    【解决方案1】:

    这是错误的方式:

    Model model = ds.getDefaultModel() ;
    ds.begin(ReadWrite.READ) ;
    

    试试吧:

    ds.begin(ReadWrite.READ) ;
    Model model = ds.getDefaultModel() ;
    

    【讨论】:

    • 非常感谢,andy...我从没想过这可能是导致这个问题的原因...我浪费了几个小时来解决这个问题,而您的解决方案让我很开心...:)
    • 我又面临一个问题...当我尝试编写时...您的解决方案没有给出错误但不向我的数据库写入任何内容但是当我第一次创建模型然后写入时ds.begin(ReadWrite.WRITE) ;然后它工作正常,但在 tomcat 中出现错误..我该怎么办?
    • 这是我提出的问题的链接...stackoverflow.com/questions/24349035/…
    【解决方案2】:

    问题是你正在泄漏资源并且没有自己清理

    您使用ds.begin(ReadWrite.READ) 调用启动事务,但您从未使用ds.end() 调用关闭事务,这就是后续调用失败并出现您看到的错误的原因。你也没有关闭你的QueryExecution

    您应该使用try { } catch { } finally { } 来确保您清理相关资源

    【讨论】:

    • 我已经更改了代码,但仍然存在错误..怎么办??当我从命令行运行相同的代码时,没有错误..
    • 你能同时显示你的新代码和错误(假设它有点不同)吗?
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2015-10-08
    相关资源
    最近更新 更多