0


私はSpringとHibernateを使用して、2つのデータソース構成を使用して複数のデータベースサーバーの保存、更新を同時に行っています。私は使っている

org.springframework.jdbc.datasource.DriverManagerDataSource

データソースを作成するためのクラス。データベース サーバーの両方が稼働中であれば、正常に動作しています。データベース サーバーの 1 つを閉じて例外をキャッチしようとすると、catch ブロックに入らず、Web ブラウザーにスタック トレース エラーが表示されます。

Stack Trace:
    ** ネストされた例外の開始 **
    java.net.ConnectException
    メッセージ: 接続が拒否されました: 接続
スタックトレース:

java.net.ConnectException: 接続が拒否されました: 接続
    java.net.PlainSocketImpl.socketConnect(ネイティブメソッド)で
    java.net.PlainSocketImpl.doConnect (PlainSocketImpl.java:333) で
    java.net.PlainSocketImpl.connectToAddress (PlainSocketImpl.java:195) で
    java.net.PlainSocketImpl.connect (PlainSocketImpl.java:182) で
    java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)で
    java.net.Socket.connect(Socket.java:525) で
    java.net.Socket.connect(Socket.java:475) で
    java.net.Socket で (Socket.java:372)
    java.net.Socket で (Socket.java:215)
    com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256) で
    com.mysql.jdbc.MysqlIO で。(MysqlIO.java:271)
    com.mysql.jdbc.Connection.createNewIO(Connection.java:2771) で
    com.mysql.jdbc.Connection.(Connection.java:1555) で
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) で
    java.sql.DriverManager.getConnection(DriverManager.java:582) で
    java.sql.DriverManager.getConnection(DriverManager.java:154) で
    org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:173) で
    org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:164) で
    org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149) で
    org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119) で
    org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82) で
    org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) で
    org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) で
    org.hibernate.jdbc.AbstractBatcher.prepareStatement (AbstractBatcher.java:116) で
    org.hibernate.id.insert.AbstractSelectingDelegate.performInsert (AbstractSelectingDelegate.java:54) で
    org.hibernate.persister.entity.AbstractEntityPersister.insert (AbstractEntityPersister.java:2186) で
    org.hibernate.persister.entity.AbstractEntityPersister.insert (AbstractEntityPersister.java:2666) で
    org.hibernate.action.EntityIdentityInsertAction.execute (EntityIdentityInsertAction.java:71) で
    org.hibernate.engine.ActionQueue.execute (ActionQueue.java:279) で
    org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate (AbstractSaveEventListener.java:321) で
    org.hibernate.event.def.AbstractSaveEventListener.performSave (AbstractSaveEventListener.java:204) で
    org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId (AbstractSaveEventListener.java:130) で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) で
    org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId (DefaultSaveEventListener.java:56) で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient (DefaultSaveOrUpdateEventListener.java:195) で
    org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) で
    org.hibernate.impl.SessionImpl.fireSave (SessionImpl.java:562) で
    org.hibernate.impl.SessionImpl.save (SessionImpl.java:550) で
    org.hibernate.impl.SessionImpl.save (SessionImpl.java:546) で
    org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:686) で
    org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:1) で
    org.springframework.orm.hibernate3.HibernateTemplate.doExecute (HibernateTemplate.java:406) で
    org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) で
    org.springframework.orm.hibernate3.HibernateTemplate.save (HibernateTemplate.java:683) で
    com.service.RegistrationServiceImpl.add(RegistrationServiceImpl.java:56) で
    com.controller.RegistrationController.onSubmit (RegistrationController.java:48) で
    org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:272) で
    org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:268) で
    org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153) で
    org.springframework.web.servlet.mvc.SimpleControllerHandlerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) で
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:763) で
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:709) で
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:613) で
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:536) で
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647) で
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) で
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:269) で
    org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:188) で
    org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:213) で
    org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:172) で
    org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:127) で
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) で
    org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:108) で
    org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:174) で
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879) で
    org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) で
    org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket (PoolTcpEndpoint.java:528) で
    org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt (LeaderFollowerWorkerThread.java:81) で
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) で
    java.lang.Thread.run(Thread.java:619) で


** ネストされた例外の終了 *

この例外を処理するにはどうすればよいですか。db サーバーの 1 つがダウンしていることを GUI に表示したい db サーバーのいずれかがダウンしている場合。

これについて助けてください。

4

2 に答える 2

1

次の 2 つのオプションがあると思います。

  • リスト アイテム サービス レイヤで例外をキャッチする必要がありますが (たとえば のようにRegistrationServiceImpl)、すべてのサービス クラスでこれを行う必要があります。
  • この特定の例外をキャッチするサーブレット フィルターを作成し、ユーザーを「申し訳ありませんが、データベースがダウンしています」などのページにリダイレクトします。
于 2012-10-29T08:10:38.717 に答える
1

春には@ExceptionHandlerアノテーションがあります。あなたのいくつかの共通クラスでハンドラーメソッドを作成できます。例外がスローされるたびに、このようなスローされた例外に応じて、必要なメッセージを便利に表示できます

@Component
public class BaseController {

@ExceptionHandler(Throwable.class)
public ModelAndView handleException(Throwable throwable, HttpServletRequest request){

    ModelAndView view = null;
    if (throwable instanceof ConnectException){
        view = //set message and return view;
    }else if (throwable instanceof someOtherException) {
        //do something else;

 //handle as many exceptions as you want
    }else {
           //do something by default for other unhandled/generic exceptions 
          }

    return view;
}

}

ドキュメントでは、サポートされている戻り値の型について詳しく説明しています。

次のように、必要な種類の例外のみを処理するようにハンドラーを作成することもできます。

@ExceptionHandler(ConnectException.class)
public ModelAndView handleException(ConnectException ex, HttpServletRequest request){
// handle it 
}

同様の行にあるこの例を確認できます。

これが役立つことを願っています。乾杯 :)

于 2012-10-29T14:04:50.307 に答える