/** * Copyright 1999-2011 Alibaba Group * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.cobar.client.datasources; import javax.sql.DataSource; /** * {@link CobarDataSourceDescriptor} describe a data base deployment structure * with 2 databases as HA group.<br> * it looks like:<br> * * <pre> * Client * /\ * / \ * Active DB <-> Standby DB * </pre> {@link #targetDataSource} should be the reference to the current active * database, while {@link #standbyDataSource} should be the standby database.<br> * for both {@link #targetDataSource} and {@link #standbyDataSource}, each one * should have a sibling data source that connect to the same target database.<br> * as to the reason why do so, that's : * <ol> * <li>these sibling DataSources will be used when do * database-status-detecting.(if we fetch connection from target data source, * when it's full, the deteting behavior can't be performed.)</li> * <li>if the {@link #targetDataSource} and {@link #standbyDataSource} are * DataSource implementations configured in local application container, we can * fetch necessary information via reflection to create connection to target * database independently, but if they are fetched from JNDI, we can't, so * explicitly declaring sibling data sources is necessary in this situation.</li> * </ol> * * @author fujohnwang * @since 1.0 */ public class CobarDataSourceDescriptor { /** * the identity of to-be-exposed DataSource. */ private String identity; /** * active data source */ private DataSource targetDataSource; /** * detecting data source for active data source */ private DataSource targetDetectorDataSource; /** * standby data source */ private DataSource standbyDataSource; /** * detecting datasource for standby data source */ private DataSource standbyDetectorDataSource; /** * we will initialize proper thread pools which stand in front of data * sources as per connection pool size. <br> * usually, they will have same number of objects.<br> * you have to set a proper size for this attribute as per your data source * attributes. In case you forget it, we set a default value with * "number of CPU" * 5. */ private int poolSize = Runtime.getRuntime().availableProcessors() * 5; public String getIdentity() { return identity; } public void setIdentity(String identity) { this.identity = identity; } public DataSource getTargetDataSource() { return targetDataSource; } public void setTargetDataSource(DataSource targetDataSource) { this.targetDataSource = targetDataSource; } public DataSource getTargetDetectorDataSource() { return targetDetectorDataSource; } public void setTargetDetectorDataSource(DataSource targetDetectorDataSource) { this.targetDetectorDataSource = targetDetectorDataSource; } public DataSource getStandbyDataSource() { return standbyDataSource; } public void setStandbyDataSource(DataSource standbyDataSource) { this.standbyDataSource = standbyDataSource; } public DataSource getStandbyDetectorDataSource() { return standbyDetectorDataSource; } public void setStandbyDetectorDataSource(DataSource standbyDetectorDataSource) { this.standbyDetectorDataSource = standbyDetectorDataSource; } public void setPoolSize(int poolSize) { this.poolSize = poolSize; } public int getPoolSize() { return poolSize; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((identity == null) ? 0 : identity.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; CobarDataSourceDescriptor other = (CobarDataSourceDescriptor) obj; if (identity == null) { if (other.identity != null) return false; } else if (!identity.equals(other.identity)) return false; return true; } @Override public String toString() { return "CobarDataSourceDescriptor [identity=" + identity + ", poolSize=" + poolSize + ", standbyDataSource=" + standbyDataSource + ", standbyDetectorDataSource=" + standbyDetectorDataSource + ", targetDataSource=" + targetDataSource + ", targetDetectorDataSource=" + targetDetectorDataSource + "]"; } }