代码之家  ›  专栏  ›  技术社区  ›  Ondra Žižka David Lilljegren

wicket:处理JDBC连接错误的位置

  •  0
  • Ondra Žižka David Lilljegren  · 技术社区  · 14 年前

    我有一个基于弹簧的Wicket应用程序。
    有一个集合的数据源bean。
    现在,当mysql死了,我会得到一个默认的wicket错误页面和stacktrace。

    我想处理这种情况,只允许一些页面 完全显示(静态的),并为其他人显示自定义错误页。

    我应该如何有效地实现这一点?

    我知道我可以在页面的代码中捕获异常,但这是一种不可靠的MySQL实例,而且经常会出错:)或者,想想其他不可靠的资源。 为每一页添加if似乎效率很低。我想要一些需要资源的页面列表,并将请求重定向到自定义错误页面。

    我在想有一些全球性的 boolean isResourceReady 以及一些线程,这些线程将在出现错误时启动并定期检查可用性,最终在资源返回时允许动态页。

    谢谢小费。

    Root cause:
    
    java.net.ConnectException: Connection refused
    at ... java.net stuff
    ... JDBC stuff
    ... Spring stuff
    ... DBCP and Pool stuff
    ... Hibernate stuff
    at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:88)
    at cz.oz.wicket.stack.dao.TestEntityDaoImpl$1.doInJpa(TestEntityDaoImpl.java:36)
    at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:184)
    at cz.oz.wicket.stack.dao.TestEntityDaoImpl.createSyntheticTestEntity(TestEntityDaoImpl.java:32)
    at cz.oz.wicket.stack.pages.home.HomePage.<init>(HomePage.java:31)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:188)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:65)
    at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:298)
    at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:320)
    at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:234)
    at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92)
    at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250)
    at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
    at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428)
    at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
    at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479)
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:926)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
    at org.mo
    
    2 回复  |  直到 13 年前
        1
  •  2
  •   Don Roby    14 年前

    你最好用 the normal error page handling in Wicket .

    但是,如果您希望预测异常而不是对其作出反应,那么这似乎是servletfilter的自然应用。特别是如果您已经在使用Spring OpenSessionViewFilter,那么您可以将其子类化并重写

    protected Session getSession(SessionFactory sessionFactory) 
    

    检测到没有数据库连接并转发到一个特殊页。

    如果您使用的是过滤器,那么决定是否转到错误页可能仍然需要某种全局性的驱动,但这可能只是您在WebApplication对象中维护的静态页的列表,该对象已经是单例的。

        2
  •  0
  •   Jacek Cz    13 年前

    在施工中尽量降低。 在oninitialize()中执行更多操作,可以更好地控制错误。