/*
* Copyright 2014 mango.jfaster.org
*
* The Mango Project licenses this file to you 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 org.jfaster.mango.transaction;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 监控datasource
*
* @author ash
*/
public class DataSourceMonitor {
private static final ConcurrentHashMap<DataSource, AtomicInteger> map =
new ConcurrentHashMap<DataSource, AtomicInteger>();
private static volatile boolean forceCheckAutoCommit = false;
public static boolean needCheckAutoCommit(DataSource ds) {
return forceCheckAutoCommit || map.get(ds) != null;
}
public static void resetAutoCommitFail(DataSource ds) {
AtomicInteger val = map.get(ds);
if (val == null) {
val = new AtomicInteger();
AtomicInteger old = map.putIfAbsent(ds, val);
if (old != null) {
val = old;
}
}
val.incrementAndGet();
}
public static void setForceCheckAutoCommit(boolean forceCheckAutoCommit) {
DataSourceMonitor.forceCheckAutoCommit = forceCheckAutoCommit;
}
public static Map<DataSource, Integer> getFailedDataSources() {
Map<DataSource, Integer> dsMap = new HashMap<DataSource, Integer>();
for (Map.Entry<DataSource, AtomicInteger> entry : map.entrySet()) {
dsMap.put(entry.getKey(), entry.getValue().intValue());
}
return dsMap;
}
}