2012-02-23 13 views
5

W źródle danych JBoss można podać wiele ciągów połączeń dla awarii bazy danych, w której chcę.Baza danych Fail Over w Jboss Źródła danych

Będą dwie bazy danych Mysql z tymi samymi tabelami, na przykład DB1 i DB2. Chcę wstawić dane do DB1, jeśli DB1 jest w dół, to muszę wstawić go do DB2. Podczas wstawiania do DB2, jeśli pojawi się DB1, muszę wstawić resztę danych do DB1. Jak mogę to skonfigurować w moim JBoss?

+1

możesz skonfigurować poprawny klaster MySQL: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication-failover. html – home

Odpowiedz

2
<?xml version="2.0" encoding="UTF-8"?> 
<!-- $Id$ --> 

<!-- Datasource config for MySQL using 3.0.9 available from: 
    http://www.mysql.com/downloads/api-jdbc-stable.html 
     --> 
    <datasources> 
    <local-tx-datasource> 

     <jndi-name>MySqlDSTest</jndi-name> 
     <use-java-context>true</use-java-context> 
     <connection-url>jdbc:mysql:loadbalance://ip1,ip2:3306/dbname?</connection-url> 
     <url-delimiter>|</url-delimiter> 
     <driver-class>com.mysql.jdbc.Driver</driver-class> 
     <connection-property name="readOnly">false</connection-property> 
     <autoReconnect>true</autoReconnect> 
     <failOverReadOnly>false</failOverReadOnly> 
     <user-name>userName</user-name> 
     <password>password</password> 
     <check-valid-connection-sql>selcect count(*) from TEST_TAB</check-valid-connection-sql> 
     <maxReconnects>0</maxReconnects> 
     <initialTimeout>15</initialTimeout> 
     <idle-timeout-minutes>0</idle-timeout-minutes> 
     <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name> 
     <!-- Advanced options for the MySQL Driver can be set with 
       <connection-property name="property">value</connection-property> 
     --> 
     <min-pool-size>5</min-pool-size> 
     <!-- Don't set this any higher than max_connections on your 
      MySQL server, usually this should be a 10 or a few 10's 
      of connections, not hundreds or thousands --> 
     <max-pool-size>20</max-pool-size> 
     <!-- Don't allow connections to hang out idle too long, 
      never longer than what wait_timeout is set to on the 
      server...A few minutes is usually okay here, 
      it depends on your application 
      and how much spikey load it will see --> 

     <!-- If you're using Connector/J 3.1.8 or newer, you can use 
      our implementation of these to increase the robustness 
      "mysql-ds.xml" 64L, 3683C  of the connection pool. --> 
     <exception-sorter-class-name> 
     com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter 
     </exception-sorter-class-name> 
     <valid-connection-checker-class-name> 
     com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker 
     </valid-connection-checker-class-name> 
     <!-- sql to call when connection is created --> 
     <new-connection-sql>select 1</new-connection-sql> 
     <!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers --> 
     <check-valid-connection-sql> 
     select 1 
     </check-valid-connection-sql> 
     <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml --> 
     <metadata> 
     <type-mapping>mySQL</type-mapping> 
     </metadata> 
    </local-tx-datasource> 
    </datasources> 

To będzie pracować dla mapowania jboss

+0

Jeśli anulujesz false, połączenie awaryjne (DB2) będzie tylko do odczytu, a otrzymasz komunikat o błędzie: ### Przyczyna : java.sql.SQLException: Connection jest tylko do odczytu. Zapytania prowadzące do modyfikacji danych są niedozwolone ; SQL []; Połączenie jest tylko do odczytu. Zapytania prowadzące do modyfikacji danych są niedozwolone; Zagnieżdżony wyjątek to java.sql.SQLException: Connection jest tylko do odczytu. Zapytania prowadzące do modyfikacji danych są niedozwolone w ... –

2

Postępuj zgodnie z tą dokumentacją. Jboss ma ustawienia konfiguracyjne. https://community.jboss.org/wiki/JBossJCADatabaseFailover

Dodatkowo, jeśli nie jesteś za pomocą JNDI i zwykłego połączenia JDBC I hav innego rozwiązania - Załóżmy, że wykonanie połączenia jdbc następnie trzeba będzie uzyskać połączenie DB, jeśli DB jest w dół, a następnie dostaniesz Database wyjątkiem połączenie, w bloku try catch, jeśli napotka wyjątek połączenia, utworzyć połączenie w sobie blok catch do drugiej bazy :-)