mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
@@ -17,6 +17,8 @@
|
||||
<junit.version>4.11</junit.version>
|
||||
|
||||
<gpg.skip>true</gpg.skip>
|
||||
<javadoc.skip>true</javadoc.skip>
|
||||
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<jdk.version>1.6</jdk.version>
|
||||
</properties>
|
||||
@@ -131,7 +133,7 @@
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<skip>true</skip>
|
||||
<skip>${javadoc.skip}</skip>
|
||||
<show>public</show>
|
||||
<charset>UTF-8</charset>
|
||||
<encoding>UTF-8</encoding>
|
||||
|
||||
@@ -19,7 +19,7 @@ public final class VERSION {
|
||||
|
||||
public final static int MajorVersion = 0;
|
||||
public final static int MinorVersion = 2;
|
||||
public final static int RevisionVersion = 17;
|
||||
public final static int RevisionVersion = 18;
|
||||
|
||||
public static String getVersionNumber() {
|
||||
return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion;
|
||||
|
||||
@@ -248,8 +248,6 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
|
||||
this.useLocalSessionState = useLocalSessionState;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public boolean isOracle() {
|
||||
return isOracle;
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import javax.management.JMException;
|
||||
import javax.management.ObjectName;
|
||||
@@ -45,6 +46,8 @@ import javax.sql.ConnectionEventListener;
|
||||
import javax.sql.ConnectionPoolDataSource;
|
||||
import javax.sql.PooledConnection;
|
||||
|
||||
import org.h2.util.StringUtils;
|
||||
|
||||
import com.alibaba.druid.TransactionTimeoutException;
|
||||
import com.alibaba.druid.VERSION;
|
||||
import com.alibaba.druid.filter.AutoLoad;
|
||||
@@ -91,6 +94,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
// stats
|
||||
private final AtomicLong recycleErrorCount = new AtomicLong();
|
||||
private long connectCount = 0L;
|
||||
private long closeCount = 0L;
|
||||
private final AtomicLong connectErrorCount = new AtomicLong();
|
||||
@@ -265,6 +269,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
preparedStatementCount.set(0);
|
||||
transactionHistogram.reset();
|
||||
cachedPreparedStatementDeleteCount.set(0);
|
||||
recycleErrorCount.set(0);
|
||||
}
|
||||
|
||||
public boolean isEnable() {
|
||||
@@ -379,6 +384,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
return;
|
||||
}
|
||||
|
||||
final ReentrantLock lock = this.lock;
|
||||
try {
|
||||
lock.lockInterruptibly();
|
||||
} catch (InterruptedException e) {
|
||||
@@ -469,18 +475,15 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
initExceptionSorter();
|
||||
initValidConnectionChecker();
|
||||
|
||||
if (driver.getClass().getName().equals("com.mysql.jdbc.Driver")) {
|
||||
if (this.isPoolPreparedStatements()) {
|
||||
LOG.error("mysql should not use 'PoolPreparedStatements'");
|
||||
}
|
||||
}
|
||||
|
||||
if (useGloalDataSourceStat) {
|
||||
if (isUseGloalDataSourceStat()) {
|
||||
dataSourceStat = JdbcDataSourceStat.getGlobal();
|
||||
if (dataSourceStat == null) {
|
||||
dataSourceStat = new JdbcDataSourceStat("Global", "Global", this.dbType);
|
||||
JdbcDataSourceStat.setGlobal(dataSourceStat);
|
||||
}
|
||||
if (dataSourceStat.getDbType() == null) {
|
||||
dataSourceStat.setDbType(this.getDbType());
|
||||
}
|
||||
} else {
|
||||
dataSourceStat = new JdbcDataSourceStat(this.name, this.jdbcUrl, this.dbType);
|
||||
}
|
||||
@@ -1042,8 +1045,13 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
}
|
||||
|
||||
LOG.error("recyle error", e);
|
||||
recycleErrorCount.incrementAndGet();
|
||||
}
|
||||
}
|
||||
|
||||
public long getRecycleErrorCount() {
|
||||
return recycleErrorCount.get();
|
||||
}
|
||||
|
||||
public void clearStatementCache() throws SQLException {
|
||||
lock.lock();
|
||||
@@ -1228,7 +1236,15 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
|
||||
@Override
|
||||
public Connection getConnection(String username, String password) throws SQLException {
|
||||
throw new UnsupportedOperationException("Not supported by DruidDataSource");
|
||||
if (!StringUtils.equals(username, this.username)) {
|
||||
throw new UnsupportedOperationException("Not supported by DruidDataSource");
|
||||
}
|
||||
|
||||
if (!StringUtils.equals(password, this.password)) {
|
||||
throw new UnsupportedOperationException("Not supported by DruidDataSource");
|
||||
}
|
||||
|
||||
return getConnection();
|
||||
}
|
||||
|
||||
public long getCreateCount() {
|
||||
|
||||
+17
@@ -61,6 +61,23 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int numberCount = 0;
|
||||
for (int i = name.length() - 1; i >= 0; --i) {
|
||||
char ch = name.charAt(i);
|
||||
if (ch < '0' || ch > '9') {
|
||||
break;
|
||||
} else {
|
||||
numberCount++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numberCount > 1) {
|
||||
int numPos = name.length() - numberCount;
|
||||
String realName = name.substring(0, numPos);
|
||||
print(realName);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
print(name);
|
||||
return false;
|
||||
|
||||
@@ -70,9 +70,18 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean {
|
||||
|
||||
private final AtomicLong blobOpenCount = new AtomicLong();
|
||||
|
||||
private static JdbcDataSourceStat global = new JdbcDataSourceStat(
|
||||
"global",
|
||||
"global");
|
||||
private static JdbcDataSourceStat global;
|
||||
|
||||
static {
|
||||
String dbType = null;
|
||||
{
|
||||
String property = System.getProperty("druid.globalDbType");
|
||||
if (property != null && property.length() > 0) {
|
||||
dbType = property;
|
||||
}
|
||||
}
|
||||
global = new JdbcDataSourceStat("Global", "Global", dbType);
|
||||
}
|
||||
|
||||
public static JdbcDataSourceStat getGlobal() {
|
||||
return global;
|
||||
@@ -114,6 +123,14 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean {
|
||||
sqlStatMap = new LRUCache<String, JdbcSqlStat>(maxSize, 16, 0.75f, false);
|
||||
}
|
||||
|
||||
public String getDbType() {
|
||||
return dbType;
|
||||
}
|
||||
|
||||
public void setDbType(String dbType) {
|
||||
this.dbType = dbType;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
blobOpenCount.set(0);
|
||||
clobOpenCount.set(0);
|
||||
@@ -266,6 +283,7 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean {
|
||||
if (sqlStat == null) {
|
||||
sqlStat = new JdbcSqlStat(sql);
|
||||
sqlStat.setDbType(this.dbType);
|
||||
sqlStat.setName(this.name);
|
||||
sqlStatMap.put(sql, sqlStat);
|
||||
}
|
||||
|
||||
|
||||
@@ -191,9 +191,11 @@ public class WebStatFilter implements Filter {
|
||||
|
||||
if (isProfileEnable()) {
|
||||
Profiler.release(nanos);
|
||||
|
||||
|
||||
Map<ProfileEntryKey, ProfileEntryReqStat> requestStatsMap = Profiler.getStatsMap();
|
||||
uriStat.getProfiletat().record(requestStatsMap);
|
||||
if (uriStat != null) {
|
||||
uriStat.getProfiletat().record(requestStatsMap);
|
||||
}
|
||||
Profiler.removeLocal();
|
||||
}
|
||||
}
|
||||
@@ -380,8 +382,9 @@ public class WebStatFilter implements Filter {
|
||||
StatFilterContext.getInstance().addContextListener(statFilterContextListener);
|
||||
|
||||
this.contextPath = DruidWebUtils.getContextPath(config.getServletContext());
|
||||
webAppStat = new WebAppStat(contextPath, this.sessionStatMaxCount);
|
||||
|
||||
if (webAppStat == null) {
|
||||
webAppStat = new WebAppStat(contextPath, this.sessionStatMaxCount);
|
||||
}
|
||||
WebAppStatManager.getInstance().addWebAppStatSet(webAppStat);
|
||||
}
|
||||
|
||||
@@ -410,6 +413,10 @@ public class WebStatFilter implements Filter {
|
||||
this.profileEnable = profileEnable;
|
||||
}
|
||||
|
||||
public void setWebAppStat(WebAppStat webAppStat) {
|
||||
this.webAppStat = webAppStat;
|
||||
}
|
||||
|
||||
public WebAppStat getWebAppStat() {
|
||||
return webAppStat;
|
||||
}
|
||||
|
||||
@@ -63,7 +63,6 @@ import com.alibaba.druid.wall.WallContext;
|
||||
import com.alibaba.druid.wall.WallProvider;
|
||||
import com.alibaba.druid.wall.WallSqlTableStat;
|
||||
import com.alibaba.druid.wall.WallVisitor;
|
||||
import com.alibaba.druid.wall.spi.WallVisitorUtils.WallConditionContext;
|
||||
import com.alibaba.druid.wall.violation.ErrorCode;
|
||||
import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation;
|
||||
|
||||
@@ -178,13 +177,13 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
public boolean visit(Limit x) {
|
||||
if (x.getRowCount() instanceof SQLNumericLiteralExpr) {
|
||||
WallContext context = WallContext.current();
|
||||
|
||||
|
||||
int rowCount = ((SQLNumericLiteralExpr) x.getRowCount()).getNumber().intValue();
|
||||
if (rowCount == 0) {
|
||||
if (context != null) {
|
||||
context.incrementWarnnings();
|
||||
}
|
||||
|
||||
|
||||
if (!provider.getConfig().isLimitZeroAllow()) {
|
||||
this.getViolations().add(new IllegalSQLObjectViolation(ErrorCode.LIMIT_ZERO, "limit row 0",
|
||||
this.toSQL(x)));
|
||||
@@ -209,8 +208,21 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
if (!checkVar(x.getParent(), x.getName())) {
|
||||
boolean isTop = WallVisitorUtils.isTopNoneFromSelect(this, x);
|
||||
if (!isTop) {
|
||||
violations.add(new IllegalSQLObjectViolation(ErrorCode.VARIANT_DENY, "variable not allow : "
|
||||
+ x.getName(), toSQL(x)));
|
||||
boolean allow = true;
|
||||
if (isDeny(varName)) {
|
||||
allow = false;
|
||||
}
|
||||
|
||||
if (allow) {
|
||||
if (WallVisitorUtils.isWhereOrHaving(x)) {
|
||||
allow = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!allow) {
|
||||
violations.add(new IllegalSQLObjectViolation(ErrorCode.VARIANT_DENY, "variable not allow : "
|
||||
+ x.getName(), toSQL(x)));
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -248,6 +260,14 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isDeny(String varName) {
|
||||
if (varName.startsWith("@@")) {
|
||||
varName = varName.substring(2);
|
||||
}
|
||||
|
||||
return config.getDenyVariants().contains(varName);
|
||||
}
|
||||
|
||||
public boolean visit(SQLVariantRefExpr x) {
|
||||
String varName = x.getName();
|
||||
@@ -256,10 +276,23 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
}
|
||||
|
||||
if (varName.startsWith("@@") && !checkVar(x.getParent(), x.getName())) {
|
||||
boolean noneCondition = WallVisitorUtils.getWallConditionContext() == null;
|
||||
if (!noneCondition) {
|
||||
violations.add(new IllegalSQLObjectViolation(ErrorCode.VARIANT_DENY, "variable not allow : "
|
||||
+ x.getName(), toSQL(x)));
|
||||
boolean isTop = WallVisitorUtils.isTopNoneFromSelect(this, x);
|
||||
if (!isTop) {
|
||||
boolean allow = true;
|
||||
if (isDeny(varName)) {
|
||||
allow = false;
|
||||
}
|
||||
|
||||
if (allow) {
|
||||
if (WallVisitorUtils.isWhereOrHaving(x)) {
|
||||
allow = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!allow) {
|
||||
violations.add(new IllegalSQLObjectViolation(ErrorCode.VARIANT_DENY, "variable not allow : "
|
||||
+ x.getName(), toSQL(x)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -60,6 +60,7 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
@@ -622,6 +623,40 @@ public class WallVisitorUtils {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isWhereOrHaving(SQLObject x) {
|
||||
if (x == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
SQLObject parent = x.getParent();
|
||||
|
||||
if (parent == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (parent instanceof SQLSelectQueryBlock) {
|
||||
SQLSelectQueryBlock query = (SQLSelectQueryBlock) parent;
|
||||
if (query.getWhere() == x) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (parent instanceof SQLSelectGroupByClause) {
|
||||
SQLSelectGroupByClause groupBy = (SQLSelectGroupByClause) parent;
|
||||
if (x == groupBy.getHaving()) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
x = parent;
|
||||
}
|
||||
}
|
||||
|
||||
public static class WallConditionContext {
|
||||
|
||||
private boolean partAlwayrue;
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
basedir
|
||||
version_compile_os
|
||||
version
|
||||
@@ -21,6 +21,7 @@ import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.wall.WallConfig;
|
||||
import com.alibaba.druid.wall.WallUtils;
|
||||
import com.alibaba.druid.wall.spi.MySqlWallProvider;
|
||||
|
||||
/**
|
||||
* 这个场景测试访问Oracle系统对象
|
||||
@@ -30,16 +31,16 @@ import com.alibaba.druid.wall.WallUtils;
|
||||
public class MySqlWallPermitVariantTest extends TestCase {
|
||||
|
||||
public void test_allow() throws Exception {
|
||||
WallConfig config = new WallConfig();
|
||||
config.setVariantCheck(false);
|
||||
MySqlWallProvider provider = new MySqlWallProvider();
|
||||
provider.getConfig().setVariantCheck(false);
|
||||
|
||||
Assert.assertTrue(WallUtils.isValidateMySql("select @@version_compile_os FROM X", config));
|
||||
Assert.assertTrue(provider.checkValid("select @@version_compile_os FROM X"));
|
||||
}
|
||||
|
||||
public void test_not_allow() throws Exception {
|
||||
WallConfig config = new WallConfig();
|
||||
config.setVariantCheck(true);
|
||||
MySqlWallProvider provider = new MySqlWallProvider();
|
||||
provider.getConfig().setVariantCheck(true);
|
||||
|
||||
Assert.assertFalse(WallUtils.isValidateMySql("select @@version_compile_os FROM X", config));
|
||||
Assert.assertFalse(provider.checkValid("select @@version_compile_os FROM X"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class MySqlWallTest72 extends TestCase {
|
||||
provider.getConfig().setCommentAllow(true);
|
||||
|
||||
Assert.assertFalse(provider.checkValid(//
|
||||
"select * from t /**/ where 1=1"));
|
||||
"select * from t /**/ where fid = 123 AND 1=1"));
|
||||
|
||||
Assert.assertEquals(1, provider.getTableStats().size());
|
||||
}
|
||||
|
||||
@@ -17,9 +17,10 @@ package com.alibaba.druid.bvt.pool;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import junit.framework.Assert;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import com.alibaba.druid.support.logging.Log;
|
||||
|
||||
@@ -50,6 +51,6 @@ public class ConfigErrorTest3 extends TestCase {
|
||||
|
||||
Assert.assertEquals(0, LOG.getErrorCount());
|
||||
dataSource.init();
|
||||
Assert.assertEquals(1, LOG.getErrorCount());
|
||||
Assert.assertEquals(0, LOG.getErrorCount());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,30 +24,25 @@ public class DruidDataSourceC3P0AdapterTest extends TestCase {
|
||||
dataSource.close();
|
||||
}
|
||||
|
||||
public void test_conn_err() throws Exception {
|
||||
Exception error = null;
|
||||
try {
|
||||
dataSource.getConnection(null, null);
|
||||
} catch (UnsupportedOperationException e) {
|
||||
error = e;
|
||||
}
|
||||
Assert.assertNotNull(error);
|
||||
public void test_conn_1() throws Exception {
|
||||
Connection conn = dataSource.getConnection(null, null);
|
||||
conn.close();
|
||||
}
|
||||
|
||||
|
||||
public void test_getDriverClass() throws Exception {
|
||||
Assert.assertNull(dataSource.getDriverClass());
|
||||
|
||||
|
||||
Connection conn = dataSource.getConnection();
|
||||
conn.close();
|
||||
|
||||
|
||||
Assert.assertEquals(MockDriver.class.getName(), dataSource.getDriverClass());
|
||||
Assert.assertEquals(MockDriver.instance, dataSource.getDriver());
|
||||
}
|
||||
|
||||
|
||||
public void test_getJdbcUrl() throws Exception {
|
||||
Assert.assertEquals("jdbc:mock:xxx", dataSource.getJdbcUrl());
|
||||
}
|
||||
|
||||
|
||||
public void test_getParentLogger_err() throws Exception {
|
||||
Exception error = null;
|
||||
try {
|
||||
@@ -57,72 +52,72 @@ public class DruidDataSourceC3P0AdapterTest extends TestCase {
|
||||
}
|
||||
Assert.assertNotNull(error);
|
||||
}
|
||||
|
||||
|
||||
public void test_propertyCycle() throws Exception {
|
||||
dataSource.setPropertyCycle(3);
|
||||
Assert.assertEquals(3, dataSource.getPropertyCycle());
|
||||
}
|
||||
|
||||
|
||||
public void test_acquireIncrement() throws Exception {
|
||||
dataSource.setAcquireIncrement(4);
|
||||
Assert.assertEquals(4, dataSource.getAcquireIncrement());
|
||||
}
|
||||
|
||||
|
||||
public void test_overrideDefaultPassword() throws Exception {
|
||||
dataSource.setOverrideDefaultPassword("x2");
|
||||
Assert.assertEquals("x2", dataSource.getOverrideDefaultPassword());
|
||||
}
|
||||
|
||||
|
||||
public void test_overrideDefaultUser() throws Exception {
|
||||
dataSource.setOverrideDefaultUser("x1");
|
||||
Assert.assertEquals("x1", dataSource.getOverrideDefaultUser());
|
||||
}
|
||||
|
||||
|
||||
public void test_factoryClassLocation() throws Exception {
|
||||
dataSource.setFactoryClassLocation("x3");
|
||||
Assert.assertEquals("x3", dataSource.getFactoryClassLocation());
|
||||
}
|
||||
|
||||
|
||||
public void test_maxConnectionAge() throws Exception {
|
||||
dataSource.setMaxConnectionAge(123);
|
||||
Assert.assertEquals(123, dataSource.getMaxConnectionAge());
|
||||
}
|
||||
|
||||
|
||||
public void test_connectionCustomizerClassName() throws Exception {
|
||||
dataSource.setConnectionCustomizerClassName("x4");
|
||||
Assert.assertEquals("x4", dataSource.getConnectionCustomizerClassName());
|
||||
}
|
||||
|
||||
|
||||
public void test_maxIdleTimeExcessConnections() throws Exception {
|
||||
dataSource.setMaxIdleTimeExcessConnections(101);
|
||||
Assert.assertEquals(101, dataSource.getMaxIdleTimeExcessConnections());
|
||||
}
|
||||
|
||||
|
||||
public void test_maxAdministrativeTaskTime() throws Exception {
|
||||
dataSource.setMaxAdministrativeTaskTime(102);
|
||||
Assert.assertEquals(102, dataSource.getMaxAdministrativeTaskTime());
|
||||
}
|
||||
|
||||
|
||||
public void test_userOverridesAsString() throws Exception {
|
||||
dataSource.setUserOverridesAsString("x5");
|
||||
Assert.assertEquals("x5", dataSource.getUserOverridesAsString());
|
||||
}
|
||||
|
||||
|
||||
public void test_usesTraditionalReflectiveProxies() throws Exception {
|
||||
dataSource.setUsesTraditionalReflectiveProxies(true);
|
||||
Assert.assertEquals(true, dataSource.isUsesTraditionalReflectiveProxies());
|
||||
}
|
||||
|
||||
|
||||
public void test_forceIgnoreUnresolvedTransactions() throws Exception {
|
||||
dataSource.setForceIgnoreUnresolvedTransactions(true);
|
||||
Assert.assertEquals(true, dataSource.isForceIgnoreUnresolvedTransactions());
|
||||
}
|
||||
|
||||
|
||||
public void test_automaticTestTable() throws Exception {
|
||||
dataSource.setAutomaticTestTable("x6");
|
||||
Assert.assertEquals("x6", dataSource.getAutomaticTestTable());
|
||||
}
|
||||
|
||||
|
||||
public void test_connectionTesterClassName() throws Exception {
|
||||
dataSource.setConnectionTesterClassName("x6");
|
||||
Assert.assertEquals("x6", dataSource.getConnectionTesterClassName());
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.alibaba.druid.bvt.pool;
|
||||
|
||||
import java.sql.Connection;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
@@ -26,10 +28,25 @@ public class DruidDataSourceTest_getConnection extends TestCase {
|
||||
dataSource.close();
|
||||
}
|
||||
|
||||
public void test_conn_error() throws Exception {
|
||||
public void test_conn_ok() throws Exception {
|
||||
Connection conn = dataSource.getConnection(null, null);
|
||||
conn.close();
|
||||
}
|
||||
|
||||
public void test_conn_user_error() throws Exception {
|
||||
Exception error = null;
|
||||
try {
|
||||
dataSource.getConnection(null, null);
|
||||
dataSource.getConnection("a", null);
|
||||
} catch (UnsupportedOperationException e) {
|
||||
error = e;
|
||||
}
|
||||
Assert.assertNotNull(error);
|
||||
}
|
||||
|
||||
public void test_conn_password_error() throws Exception {
|
||||
Exception error = null;
|
||||
try {
|
||||
dataSource.getConnection(null, "a");
|
||||
} catch (UnsupportedOperationException e) {
|
||||
error = e;
|
||||
}
|
||||
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
package com.alibaba.druid.bvt.pool.exception;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.mock.MockConnection;
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import com.alibaba.druid.pool.vendor.OracleExceptionSorter;
|
||||
import com.alibaba.druid.stat.DruidDataSourceStatManager;
|
||||
import com.alibaba.druid.stat.JdbcStatManager;
|
||||
import com.alibaba.druid.test.util.OracleMockDriver;
|
||||
import com.alibaba.druid.util.JdbcUtils;
|
||||
|
||||
public class OracleExceptionSorterTest_concurrent extends TestCase {
|
||||
|
||||
private DruidDataSource dataSource;
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
Assert.assertEquals(0, JdbcStatManager.getInstance().getSqlList().size());
|
||||
|
||||
dataSource = new DruidDataSource();
|
||||
|
||||
dataSource.setExceptionSorter(new OracleExceptionSorter());
|
||||
|
||||
dataSource.setDriver(new OracleMockDriver());
|
||||
dataSource.setUrl("jdbc:mock:xxx");
|
||||
dataSource.setPoolPreparedStatements(true);
|
||||
dataSource.setMaxOpenPreparedStatements(100);
|
||||
dataSource.setMaxActive(1);
|
||||
dataSource.setMaxWait(1000 * 100);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
JdbcUtils.close(dataSource);
|
||||
Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
|
||||
}
|
||||
|
||||
public void test_connect() throws Exception {
|
||||
final CountDownLatch latch_0 = new CountDownLatch(1);
|
||||
|
||||
Thread errorThread = new Thread() {
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
Connection conn = dataSource.getConnection();
|
||||
|
||||
latch_0.countDown();
|
||||
|
||||
MockConnection mockConn = conn.unwrap(MockConnection.class);
|
||||
Assert.assertNotNull(mockConn);
|
||||
|
||||
SQLException exception = new SQLException("xx", "xxx", 28);
|
||||
mockConn.setError(exception);
|
||||
|
||||
try {
|
||||
conn.createStatement();
|
||||
} catch (SQLException ex) {
|
||||
// ex.printStackTrace();
|
||||
}
|
||||
conn.close();
|
||||
} catch (Exception error) {
|
||||
error.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
errorThread.start();
|
||||
|
||||
final CountDownLatch workLatch = new CountDownLatch(2);
|
||||
final CountDownLatch workCompleteLatch = new CountDownLatch(2);
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
Thread thread = new Thread() {
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
for (int i = 0; i < 1000; ++i) {
|
||||
workLatch.countDown();
|
||||
Connection conn = dataSource.getConnection();
|
||||
conn.close();
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
} finally {
|
||||
workCompleteLatch.countDown();
|
||||
}
|
||||
}
|
||||
};
|
||||
thread.start();
|
||||
}
|
||||
workLatch.await();
|
||||
|
||||
latch_0.countDown();
|
||||
|
||||
workCompleteLatch.await();
|
||||
|
||||
Assert.assertEquals(2001, dataSource.getConnectCount());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,14 +3,18 @@ package com.alibaba.druid.bvt.proxy.filter;
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
|
||||
import org.junit.Assert;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import com.alibaba.druid.stat.JdbcDataSourceStat;
|
||||
import com.alibaba.druid.stat.JdbcStatManager;
|
||||
import com.alibaba.druid.support.json.JSONUtils;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
import com.alibaba.druid.util.JdbcUtils;
|
||||
|
||||
public class GlobalStatTest0 extends TestCase {
|
||||
@@ -41,6 +45,7 @@ public class GlobalStatTest0 extends TestCase {
|
||||
Assert.assertEquals(0, JdbcStatManager.getInstance().getSqlList().size());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void test_execute() throws Exception {
|
||||
{
|
||||
Connection conn = dataSourceA.getConnection();
|
||||
@@ -69,6 +74,13 @@ public class GlobalStatTest0 extends TestCase {
|
||||
Assert.assertSame(JdbcDataSourceStat.getGlobal(), dataSourceB.getDataSourceStat());
|
||||
|
||||
Assert.assertEquals(1, JdbcStatManager.getInstance().getSqlList().size());
|
||||
String json = JSONUtils.toJSONString(JdbcStatManager.getInstance().getSqlList());
|
||||
List<Map<String, Object>> sqlList = (List<Map<String, Object>>) JSONUtils.parse(json);
|
||||
Map<String, Object> sqlInfo = sqlList.get(0);
|
||||
Assert.assertNotNull(sqlInfo);
|
||||
Assert.assertEquals(JdbcConstants.MOCK, sqlInfo.get("DbType"));
|
||||
Assert.assertEquals(2, sqlInfo.get("ExecuteCount"));
|
||||
Assert.assertEquals(2, sqlInfo.get("FetchRowCount"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright 1999-2011 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* 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.druid.bvt.proxy.filter;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.Statement;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.management.openmbean.TabularData;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import com.alibaba.druid.stat.DruidDataSourceStatManager;
|
||||
import com.alibaba.druid.stat.JdbcStatManager;
|
||||
import com.alibaba.druid.support.json.JSONUtils;
|
||||
import com.alibaba.druid.util.JdbcUtils;
|
||||
|
||||
public class MergeStatFilterTest_tddl_1 extends TestCase {
|
||||
|
||||
private DruidDataSource dataSource;
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
TabularData sqlList = JdbcStatManager.getInstance().getSqlList();
|
||||
if (sqlList.size() > 0) {
|
||||
for (Object item : JdbcStatManager.getInstance().getSqlList().values()) {
|
||||
String text = JSONUtils.toJSONString(item);
|
||||
System.out.println(text);
|
||||
}
|
||||
}
|
||||
|
||||
Assert.assertEquals(0, JdbcStatManager.getInstance().getSqlList().size());
|
||||
|
||||
dataSource = new DruidDataSource();
|
||||
dataSource.setUrl("jdbc:mock:xx");
|
||||
dataSource.setFilters("mergeStat");
|
||||
dataSource.setDbType("mysql");
|
||||
}
|
||||
|
||||
protected void tearDown() throws Exception {
|
||||
JdbcUtils.close(dataSource);
|
||||
|
||||
Assert.assertEquals(0, JdbcStatManager.getInstance().getSqlList().size());
|
||||
}
|
||||
|
||||
public void test_merge() throws Exception {
|
||||
for (int i = 1000; i < 2000; ++i) {
|
||||
String tableName = "t" + i;
|
||||
String sql = "select * from " + tableName + " where " + tableName + ".id = " + i;
|
||||
Connection conn = dataSource.getConnection();
|
||||
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute(sql);
|
||||
stmt.close();
|
||||
|
||||
conn.close();
|
||||
}
|
||||
|
||||
Assert.assertEquals(1, dataSource.getDataSourceStat().getSqlStatMap().size());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright 1999-2011 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* 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.druid.bvt.support.http;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.springframework.mock.web.MockFilterChain;
|
||||
import org.springframework.mock.web.MockFilterConfig;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.mock.web.MockServletContext;
|
||||
|
||||
import com.alibaba.druid.filter.stat.StatFilterContext;
|
||||
import com.alibaba.druid.support.http.WebStatFilter;
|
||||
import com.alibaba.druid.support.http.stat.WebAppStat;
|
||||
import com.alibaba.druid.support.http.stat.WebAppStatManager;
|
||||
import com.alibaba.druid.support.http.stat.WebURIStat;
|
||||
|
||||
public class WebStatFilterTest3_WebURIStatNull extends TestCase {
|
||||
|
||||
public void test_sessionStatDisable() throws Exception {
|
||||
MockServletContext servletContext = new MockServletContext();
|
||||
|
||||
MockFilterConfig filterConfig = new MockFilterConfig(servletContext);
|
||||
filterConfig.addInitParameter(WebStatFilter.PARAM_NAME_SESSION_STAT_ENABLE, "false");
|
||||
|
||||
WebStatFilter filter = new WebStatFilter();
|
||||
WebAppStat appStat = new WebAppStat() {
|
||||
public WebURIStat getURIStat(String uri, boolean create) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
filter.setWebAppStat(appStat);
|
||||
filter.setProfileEnable(true);
|
||||
|
||||
Assert.assertNotNull(filter.getWebAppStat());
|
||||
|
||||
filter.init(filterConfig);
|
||||
|
||||
Assert.assertSame(appStat, filter.getWebAppStat());
|
||||
|
||||
Assert.assertFalse(filter.isSessionStatEnable());
|
||||
Assert.assertTrue(WebAppStatManager.getInstance().getWebAppStatSet().contains(appStat));
|
||||
Assert.assertTrue(StatFilterContext.getInstance().getListeners().contains(filter.getStatFilterContextListener()));
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain();
|
||||
|
||||
Assert.assertNull(filter.getSessionStat(request));
|
||||
|
||||
filter.doFilter(request, response, chain);
|
||||
|
||||
Assert.assertEquals(0, appStat.getSessionStatDataList().size());
|
||||
|
||||
filter.destroy();
|
||||
|
||||
Assert.assertFalse(WebAppStatManager.getInstance().getWebAppStatSet().contains(appStat));
|
||||
Assert.assertFalse(StatFilterContext.getInstance().getListeners().contains(filter.getStatFilterContextListener()));
|
||||
|
||||
Map<String, Object> statData = appStat.getStatData();
|
||||
Assert.assertEquals(1L, statData.get("RequestCount"));
|
||||
}
|
||||
}
|
||||
@@ -29,6 +29,7 @@ public class ConfigFileGenerator {
|
||||
filePath = file.getAbsolutePath();
|
||||
|
||||
out = new PrintWriter(new FileWriter(file));
|
||||
out.println(DruidDataSourceFactory.PROP_MAXWAIT + "=1000");
|
||||
out.println(DruidDataSourceFactory.PROP_USERNAME + "=test1");
|
||||
out.println(DruidDataSourceFactory.PROP_PASSWORD + "=OJfUm6WCHi7EuXqE6aEc+Po2xFrAGBeSNy8O2jWhV2FTG8/5kbRRr2rjNKhptlevm/03Y0048P7h88gdUOXAYg==");
|
||||
out.println(DruidDataSourceFactory.PROP_URL + "=jdbc:oracle:thin:@");
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
package com.alibaba.druid.pool.oracle;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.Statement;
|
||||
|
||||
import junit.framework.Assert;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import com.alibaba.druid.pool.vendor.OracleValidConnectionChecker;
|
||||
|
||||
/**
|
||||
* 这个场景测试minIdle > maxActive
|
||||
*
|
||||
* @author wenshao<szujobs@hotmail.com>
|
||||
*/
|
||||
public class DruidDataSourceTest_oracle3 extends TestCase {
|
||||
|
||||
private DruidDataSource dataSource;
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
dataSource = new DruidDataSource();
|
||||
dataSource.setUrl("jdbc:oracle:thin:@192.168.122.184:1521:ORCL");
|
||||
dataSource.setUsername("system");
|
||||
dataSource.setPassword("druid");
|
||||
dataSource.setInitialSize(1);
|
||||
dataSource.setMaxActive(14);
|
||||
dataSource.setMinIdle(1);
|
||||
dataSource.setMinEvictableIdleTimeMillis(300 * 1000); // 300 / 10
|
||||
dataSource.setTimeBetweenEvictionRunsMillis(180 * 1000); // 180 / 10
|
||||
dataSource.setTestWhileIdle(false);
|
||||
dataSource.setTestOnBorrow(false);
|
||||
dataSource.setValidationQuery("SELECT 1 FROM DUAL");
|
||||
dataSource.setFilters("stat,log4j");
|
||||
}
|
||||
|
||||
protected void tearDown() throws Exception {
|
||||
dataSource.close();
|
||||
}
|
||||
|
||||
public void test_error() throws Exception {
|
||||
dataSource.init();
|
||||
Assert.assertTrue(dataSource.isOracle());
|
||||
Assert.assertTrue(dataSource.getValidConnectionChecker() instanceof OracleValidConnectionChecker);
|
||||
|
||||
try {
|
||||
Connection conn = dataSource.getConnection();
|
||||
Statement stmt = conn.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT 1 FROM DUAL");
|
||||
while (rs.next()) {
|
||||
|
||||
}
|
||||
rs.close();
|
||||
stmt.close();
|
||||
conn.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Connection conn = dataSource.getConnection();
|
||||
Statement stmt = conn.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT 1 FROM DUAL");
|
||||
while (rs.next()) {
|
||||
|
||||
}
|
||||
rs.close();
|
||||
stmt.close();
|
||||
conn.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Connection conn = dataSource.getConnection();
|
||||
Statement stmt = conn.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT 1 FROM DUAL");
|
||||
while (rs.next()) {
|
||||
|
||||
}
|
||||
rs.close();
|
||||
stmt.close();
|
||||
conn.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user