Error retrieving database metadata

This page shows Java code examples of org.springframework.jdbc.support.MetaDataAccessException

The following examples show how to use
org.springframework.jdbc.support.MetaDataAccessException.
You can vote up the ones you like or vote down the ones you don’t like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.

Example #1

/**
 * 获取当前使用数据库类型
 */
private static String getDatabaseName(DataSource dataSource) {
    try {
        String productName = JdbcUtils.
                commonDatabaseName(JdbcUtils.extractDatabaseMetaData(
                        dataSource, "getDatabaseProductName"
                ).toString());
        DatabaseDriver databaseDriver = DatabaseDriver.fromProductName(productName);
        if (databaseDriver == DatabaseDriver.UNKNOWN) {
            throw new IllegalStateException("Unable to detect database type");
        }
        return databaseDriver.getId();
    } catch (MetaDataAccessException ex) {
        throw new IllegalStateException("Unable to detect database type", ex);
    }
}
 

Example #2

private DatabaseDriver getDatabaseDriver(DataSource dataSource) {
	// copied from boot's flyway auto-config to get matching db vendor id
	try {
		String url = JdbcUtils.extractDatabaseMetaData(dataSource, "getURL");
		return DatabaseDriver.fromJdbcUrl(url);
	}
	catch (MetaDataAccessException ex) {
		throw new IllegalStateException(ex);
	}
}
 

Example #3

private String getDatabaseType(DataSource dataSource) {
	try {
		return DatabaseType.fromMetaData(dataSource).toString().toLowerCase();
	}
	catch (MetaDataAccessException ex) {
		throw new IllegalStateException("Unable to detect database type", ex);
	}
}
 

Example #4

/**
 * Get a {@link PagingQueryProvider} instance using the provided properties
 * and appropriate for the given database type.
 *
 * @see FactoryBean#getObject()
 */
@Override
public PagingQueryProvider getObject() throws Exception {

	DatabaseType type;
	try {
		type = databaseType != null ? DatabaseType.valueOf(databaseType.toUpperCase()) : DatabaseType
				.fromMetaData(dataSource);
	}
	catch (MetaDataAccessException e) {
		throw new IllegalArgumentException(
				"Could not inspect meta data for database type.  You have to supply it explicitly.", e);
	}

	AbstractSqlPagingQueryProvider provider = providers.get(type);
	Assert.state(provider != null, "Should not happen: missing PagingQueryProvider for DatabaseType=" + type);

	provider.setFromClause(fromClause);
	provider.setWhereClause(whereClause);
	provider.setSortKeys(sortKeys);
	if (StringUtils.hasText(selectClause)) {
		provider.setSelectClause(selectClause);
	}
	provider.init(dataSource);

	return provider;

}
 

Example #5

/**
 * Get a {@link PagingQueryProvider} instance using the provided properties and
 * appropriate for the given database type.
 *
 * @see FactoryBean#getObject()
 */
@Override
public PagingQueryProvider getObject() throws Exception {

	DatabaseType type;
	try {
		type = databaseType != null ? DatabaseType.valueOf(databaseType.toUpperCase())
				: DatabaseType.fromMetaData(dataSource);
	}
	catch (MetaDataAccessException e) {
		throw new IllegalArgumentException(
				"Could not inspect meta data for database type.  You have to supply it explicitly.", e);
	}

	AbstractSqlPagingQueryProvider provider = providers.get(type);
	Assert.state(provider != null, "Should not happen: missing PagingQueryProvider for DatabaseType=" + type);

	provider.setFromClause(fromClause);
	provider.setWhereClause(whereClause);
	provider.setSortKeys(sortKeys);
	if (StringUtils.hasText(selectClause)) {
		provider.setSelectClause(selectClause);
	}
	provider.init(dataSource);

	return provider;

}
 

Example #6

private DatabaseDriver getDatabaseDriver(DataSource dataSource) {
	// copied from boot's flyway auto-config to get matching db vendor id
	try {
		String url = JdbcUtils.extractDatabaseMetaData(dataSource, "getURL");
		return DatabaseDriver.fromJdbcUrl(url);
	}
	catch (MetaDataAccessException ex) {
		throw new IllegalStateException(ex);
	}
}
 

Example #7

@Bean
DataflowTaskExecutionMetadataDao dataflowTaskExecutionMetadataDao(DataSource dataSource) {
	DataFieldMaxValueIncrementerFactory incrementerFactory = new DefaultDataFieldMaxValueIncrementerFactory(dataSource);
	String databaseType;
	try {
		databaseType = DatabaseType.fromMetaData(dataSource).name();
	}
	catch (MetaDataAccessException e) {
		throw new IllegalStateException(e);
	}
	return new JdbcDataflowTaskExecutionMetadataDao(dataSource, incrementerFactory.getIncrementer(databaseType,
			"task_execution_metadata_seq"));
}
 

Example #8

@Bean
public DataflowTaskExecutionMetadataDao dataflowTaskExecutionMetadataDao(DataSource dataSource, ApplicationContext context) {
	DataFieldMaxValueIncrementerFactory incrementerFactory = new DefaultDataFieldMaxValueIncrementerFactory(dataSource);
	String databaseType;
	try {
		databaseType = DatabaseType.fromMetaData(dataSource).name();
	}
	catch (MetaDataAccessException e) {
		throw new IllegalStateException(e);
	}
	return new JdbcDataflowTaskExecutionMetadataDao(dataSource, incrementerFactory.getIncrementer(databaseType,
			"task_execution_metadata_seq"));
}
 

Example #9

@Bean
public DataflowTaskExecutionMetadataDao dataflowTaskExecutionMetadataDao(DataSource dataSource, ApplicationContext context) {
	DataFieldMaxValueIncrementerFactory incrementerFactory = new DefaultDataFieldMaxValueIncrementerFactory(dataSource);
	String databaseType;
	try {
		databaseType = DatabaseType.fromMetaData(dataSource).name();
	}
	catch (MetaDataAccessException e) {
		throw new IllegalStateException(e);
	}
	return new JdbcDataflowTaskExecutionMetadataDao(dataSource, incrementerFactory.getIncrementer(databaseType,
			"task_execution_metadata_seq"));
}
 

Example #10

@Bean
public DataflowTaskExecutionMetadataDao dataflowTaskExecutionMetadataDao(DataSource dataSource) {
	DataFieldMaxValueIncrementerFactory incrementerFactory = new DefaultDataFieldMaxValueIncrementerFactory(dataSource);
	String databaseType;
	try {
		databaseType = DatabaseType.fromMetaData(dataSource).name();
	}
	catch (MetaDataAccessException e) {
		throw new IllegalStateException(e);
	}
	return new JdbcDataflowTaskExecutionMetadataDao(dataSource, incrementerFactory.getIncrementer(databaseType,
			"task_execution_metadata_seq"));
}
 

Example #11

/**
 * Get a {@link PagingQueryProvider} instance using the provided properties and
 * appropriate for the given database type.
 *
 * @see FactoryBean#getObject()
 */
@Override
public PagingQueryProvider getObject() throws Exception {

	DatabaseType type;
	try {
		type = this.databaseType != null
				? DatabaseType.valueOf(this.databaseType.toUpperCase())
				: DatabaseType.fromMetaData(this.dataSource);
	}
	catch (MetaDataAccessException e) {
		throw new IllegalArgumentException(
				"Could not inspect meta data for database type.  You have to supply it explicitly.",
				e);
	}

	AbstractSqlPagingQueryProvider provider = this.providers.get(type);
	Assert.state(provider != null,
			"Should not happen: missing PagingQueryProvider for DatabaseType="
					+ type);

	provider.setFromClause(this.fromClause);
	provider.setWhereClause(this.whereClause);
	provider.setSortKeys(this.sortKeys);
	if (StringUtils.hasText(this.selectClause)) {
		provider.setSelectClause(this.selectClause);
	}
	provider.init(this.dataSource);

	return provider;

}
 

Example #12

private String getDatabaseType(DataSource dataSource) {
	try {
		return JdbcUtils
				.commonDatabaseName(DatabaseType.fromMetaData(dataSource).toString())
				.toLowerCase();
	}
	catch (MetaDataAccessException ex) {
		throw new IllegalStateException("Unable to detect database type", ex);
	}
}
 

Example #13

private void buildTaskExecutionDao(DataSource dataSource) {
	DataFieldMaxValueIncrementerFactory incrementerFactory = new DefaultDataFieldMaxValueIncrementerFactory(
			dataSource);
	this.dao = new JdbcTaskExecutionDao(dataSource, this.tablePrefix);
	String databaseType;
	try {
		databaseType = DatabaseType.fromMetaData(dataSource).name();
	}
	catch (MetaDataAccessException e) {
		throw new IllegalStateException(e);
	}
	((JdbcTaskExecutionDao) this.dao).setTaskIncrementer(incrementerFactory
			.getIncrementer(databaseType, this.tablePrefix + "SEQ"));
}
 

Example #14

/**
 * Creates a incrementer for the DataSource.
 * @param dataSource the datasource that the incrementer will use to record current
 * id.
 * @return a DataFieldMaxValueIncrementer object.
 */
public static DataFieldMaxValueIncrementer getIncrementer(DataSource dataSource) {
	DataFieldMaxValueIncrementerFactory incrementerFactory = new DefaultDataFieldMaxValueIncrementerFactory(
			dataSource);
	String databaseType = null;
	try {
		databaseType = DatabaseType.fromMetaData(dataSource).name();
	}
	catch (MetaDataAccessException e) {
		throw new IllegalStateException(e);
	}
	return incrementerFactory.getIncrementer(databaseType, "TASK_SEQ");
}
 

Example #15

private static boolean requiresTemporaryLob(DataSource dataSource) {
	try {
		String productName = JdbcUtils.extractDatabaseMetaData(dataSource, "getDatabaseProductName");
		return "Oracle".equalsIgnoreCase(JdbcUtils.commonDatabaseName(productName));
	}
	catch (MetaDataAccessException ex) {
		return false;
	}
}
 

Example #16

public FieldMetaData getFieldMetaData(Class businessObjectClass, String propertyName) {
    try {
        return (FieldMetaData) JdbcUtils.extractDatabaseMetaData(getDataSource(), new FieldMetaDataImpl(businessObjectClass, propertyName));
    }
    catch (MetaDataAccessException e) {
        throw new RuntimeException(new StringBuffer("BusinessObjectMetaDataDaoJdbc unable to getFieldMetaData for businessObjectClass ").append(businessObjectClass).append(" propertyName ").append(propertyName).toString(), e);
    }
}
 

Example #17

private String getDatabaseProductName() {
    String dbms = "";
    try {
        dbms = (String) JdbcUtils.extractDatabaseMetaData(dataSource, "getDatabaseProductName");

        logger.info("Database product name: " + dbms);
    } catch (MetaDataAccessException e) {
        logger.warn("Database type could not be determined!", e);
    }

    return dbms;
}
 

Example #18

private boolean versionTableExist() {
  try {
    return (boolean)
        JdbcUtils.extractDatabaseMetaData(
            dataSource,
            dbmd -> {
              ResultSet tables = dbmd.getTables(null, null, "Version", new String[] {"TABLE"});
              return tables.first();
            });
  } catch (MetaDataAccessException e) {
    return false;
  }
}
 

Example #19

/**
 * Create a {@link CallMetaDataProvider} based on the database meta-data.
 * @param dataSource the JDBC DataSource to use for retrieving meta-data
 * @param context the class that holds configuration and meta-data
 * @return instance of the CallMetaDataProvider implementation to be used
 */
public static CallMetaDataProvider createMetaDataProvider(DataSource dataSource, final CallMetaDataContext context) {
	try {
		return (CallMetaDataProvider) JdbcUtils.extractDatabaseMetaData(dataSource, databaseMetaData -> {
			String databaseProductName = JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());
			boolean accessProcedureColumnMetaData = context.isAccessCallParameterMetaData();
			if (context.isFunction()) {
				if (!supportedDatabaseProductsForFunctions.contains(databaseProductName)) {
					if (logger.isInfoEnabled()) {
						logger.info(databaseProductName + " is not one of the databases fully supported for function calls " +
								"-- supported are: " + supportedDatabaseProductsForFunctions);
					}
					if (accessProcedureColumnMetaData) {
						logger.info("Metadata processing disabled - you must specify all parameters explicitly");
						accessProcedureColumnMetaData = false;
					}
				}
			}
			else {
				if (!supportedDatabaseProductsForProcedures.contains(databaseProductName)) {
					if (logger.isInfoEnabled()) {
						logger.info(databaseProductName + " is not one of the databases fully supported for procedure calls " +
								"-- supported are: " + supportedDatabaseProductsForProcedures);
					}
					if (accessProcedureColumnMetaData) {
						logger.info("Metadata processing disabled - you must specify all parameters explicitly");
						accessProcedureColumnMetaData = false;
					}
				}
			}

			CallMetaDataProvider provider;
			if ("Oracle".equals(databaseProductName)) {
				provider = new OracleCallMetaDataProvider(databaseMetaData);
			}
			else if ("PostgreSQL".equals(databaseProductName)) {
				provider = new PostgresCallMetaDataProvider((databaseMetaData));
			}
			else if ("Apache Derby".equals(databaseProductName)) {
				provider = new DerbyCallMetaDataProvider((databaseMetaData));
			}
			else if ("DB2".equals(databaseProductName)) {
				provider = new Db2CallMetaDataProvider((databaseMetaData));
			}
			else if ("HDB".equals(databaseProductName)) {
				provider = new HanaCallMetaDataProvider((databaseMetaData));
			}
			else if ("Microsoft SQL Server".equals(databaseProductName)) {
				provider = new SqlServerCallMetaDataProvider((databaseMetaData));
			}
			else if ("Sybase".equals(databaseProductName)) {
				provider = new SybaseCallMetaDataProvider((databaseMetaData));
			}
			else {
				provider = new GenericCallMetaDataProvider(databaseMetaData);
			}

			if (logger.isDebugEnabled()) {
				logger.debug("Using " + provider.getClass().getName());
			}
			provider.initializeWithMetaData(databaseMetaData);
			if (accessProcedureColumnMetaData) {
				provider.initializeWithProcedureColumnMetaData(databaseMetaData,
						context.getCatalogName(), context.getSchemaName(), context.getProcedureName());
			}
			return provider;
		});
	}
	catch (MetaDataAccessException ex) {
		throw new DataAccessResourceFailureException("Error retrieving database meta-data", ex);
	}
}
 

Example #20

/**
 * Create a {@link TableMetaDataProvider} based on the database meta-data.
 * @param dataSource used to retrieve meta-data
 * @param context the class that holds configuration and meta-data
 * @return instance of the TableMetaDataProvider implementation to be used
 */
public static TableMetaDataProvider createMetaDataProvider(DataSource dataSource, TableMetaDataContext context) {
	try {
		return (TableMetaDataProvider) JdbcUtils.extractDatabaseMetaData(dataSource, databaseMetaData -> {
			String databaseProductName =
					JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());
			boolean accessTableColumnMetaData = context.isAccessTableColumnMetaData();
			TableMetaDataProvider provider;

			if ("Oracle".equals(databaseProductName)) {
				provider = new OracleTableMetaDataProvider(
						databaseMetaData, context.isOverrideIncludeSynonymsDefault());
			}
			else if ("PostgreSQL".equals(databaseProductName)) {
				provider = new PostgresTableMetaDataProvider(databaseMetaData);
			}
			else if ("Apache Derby".equals(databaseProductName)) {
				provider = new DerbyTableMetaDataProvider(databaseMetaData);
			}
			else if ("HSQL Database Engine".equals(databaseProductName)) {
				provider = new HsqlTableMetaDataProvider(databaseMetaData);
			}
			else {
				provider = new GenericTableMetaDataProvider(databaseMetaData);
			}

			if (logger.isDebugEnabled()) {
				logger.debug("Using " + provider.getClass().getSimpleName());
			}
			provider.initializeWithMetaData(databaseMetaData);
			if (accessTableColumnMetaData) {
				provider.initializeWithTableColumnMetaData(databaseMetaData,
						context.getCatalogName(), context.getSchemaName(), context.getTableName());
			}
			return provider;
		});
	}
	catch (MetaDataAccessException ex) {
		throw new DataAccessResourceFailureException("Error retrieving database meta-data", ex);
	}
}
 

Example #21

@Override
public void initialize(ClassLoadHelper loadHelper, SchedulerSignaler signaler) throws SchedulerConfigException {
	// Absolutely needs thread-bound DataSource to initialize.
	this.dataSource = SchedulerFactoryBean.getConfigTimeDataSource();
	if (this.dataSource == null) {
		throw new SchedulerConfigException("No local DataSource found for configuration - " +
				"'dataSource' property must be set on SchedulerFactoryBean");
	}

	// Configure transactional connection settings for Quartz.
	setDataSource(TX_DATA_SOURCE_PREFIX + getInstanceName());
	setDontSetAutoCommitFalse(true);

	// Register transactional ConnectionProvider for Quartz.
	DBConnectionManager.getInstance().addConnectionProvider(
			TX_DATA_SOURCE_PREFIX + getInstanceName(),
			new ConnectionProvider() {
				@Override
				public Connection getConnection() throws SQLException {
					// Return a transactional Connection, if any.
					return DataSourceUtils.doGetConnection(dataSource);
				}
				@Override
				public void shutdown() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
				/* Quartz 2.2 initialize method */
				public void initialize() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
			}
	);

	// Non-transactional DataSource is optional: fall back to default
	// DataSource if not explicitly specified.
	DataSource nonTxDataSource = SchedulerFactoryBean.getConfigTimeNonTransactionalDataSource();
	final DataSource nonTxDataSourceToUse = (nonTxDataSource != null ? nonTxDataSource : this.dataSource);

	// Configure non-transactional connection settings for Quartz.
	setNonManagedTXDataSource(NON_TX_DATA_SOURCE_PREFIX + getInstanceName());

	// Register non-transactional ConnectionProvider for Quartz.
	DBConnectionManager.getInstance().addConnectionProvider(
			NON_TX_DATA_SOURCE_PREFIX + getInstanceName(),
			new ConnectionProvider() {
				@Override
				public Connection getConnection() throws SQLException {
					// Always return a non-transactional Connection.
					return nonTxDataSourceToUse.getConnection();
				}
				@Override
				public void shutdown() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
				/* Quartz 2.2 initialize method */
				public void initialize() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
			}
	);

	// No, if HSQL is the platform, we really don't want to use locks...
	try {
		String productName = JdbcUtils.extractDatabaseMetaData(this.dataSource, "getDatabaseProductName");
		productName = JdbcUtils.commonDatabaseName(productName);
		if (productName != null && productName.toLowerCase().contains("hsql")) {
			setUseDBLocks(false);
			setLockHandler(new SimpleSemaphore());
		}
	}
	catch (MetaDataAccessException ex) {
		logWarnIfNonZero(1, "Could not detect database type. Assuming locks can be taken.");
	}

	super.initialize(loadHelper, signaler);

}
 

Example #22

/**
 * Create a {@link CallMetaDataProvider} based on the database meta-data.
 * @param dataSource the JDBC DataSource to use for retrieving meta-data
 * @param context the class that holds configuration and meta-data
 * @return instance of the CallMetaDataProvider implementation to be used
 */
public static CallMetaDataProvider createMetaDataProvider(DataSource dataSource, final CallMetaDataContext context) {
	try {
		return (CallMetaDataProvider) JdbcUtils.extractDatabaseMetaData(dataSource, databaseMetaData -> {
			String databaseProductName = JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());
			boolean accessProcedureColumnMetaData = context.isAccessCallParameterMetaData();
			if (context.isFunction()) {
				if (!supportedDatabaseProductsForFunctions.contains(databaseProductName)) {
					if (logger.isInfoEnabled()) {
						logger.info(databaseProductName + " is not one of the databases fully supported for function calls " +
								"-- supported are: " + supportedDatabaseProductsForFunctions);
					}
					if (accessProcedureColumnMetaData) {
						logger.info("Metadata processing disabled - you must specify all parameters explicitly");
						accessProcedureColumnMetaData = false;
					}
				}
			}
			else {
				if (!supportedDatabaseProductsForProcedures.contains(databaseProductName)) {
					if (logger.isInfoEnabled()) {
						logger.info(databaseProductName + " is not one of the databases fully supported for procedure calls " +
								"-- supported are: " + supportedDatabaseProductsForProcedures);
					}
					if (accessProcedureColumnMetaData) {
						logger.info("Metadata processing disabled - you must specify all parameters explicitly");
						accessProcedureColumnMetaData = false;
					}
				}
			}

			CallMetaDataProvider provider;
			if ("Oracle".equals(databaseProductName)) {
				provider = new OracleCallMetaDataProvider(databaseMetaData);
			}
			else if ("PostgreSQL".equals(databaseProductName)) {
				provider = new PostgresCallMetaDataProvider((databaseMetaData));
			}
			else if ("Apache Derby".equals(databaseProductName)) {
				provider = new DerbyCallMetaDataProvider((databaseMetaData));
			}
			else if ("DB2".equals(databaseProductName)) {
				provider = new Db2CallMetaDataProvider((databaseMetaData));
			}
			else if ("HDB".equals(databaseProductName)) {
				provider = new HanaCallMetaDataProvider((databaseMetaData));
			}
			else if ("Microsoft SQL Server".equals(databaseProductName)) {
				provider = new SqlServerCallMetaDataProvider((databaseMetaData));
			}
			else if ("Sybase".equals(databaseProductName)) {
				provider = new SybaseCallMetaDataProvider((databaseMetaData));
			}
			else {
				provider = new GenericCallMetaDataProvider(databaseMetaData);
			}

			if (logger.isDebugEnabled()) {
				logger.debug("Using " + provider.getClass().getName());
			}
			provider.initializeWithMetaData(databaseMetaData);
			if (accessProcedureColumnMetaData) {
				provider.initializeWithProcedureColumnMetaData(databaseMetaData,
						context.getCatalogName(), context.getSchemaName(), context.getProcedureName());
			}
			return provider;
		});
	}
	catch (MetaDataAccessException ex) {
		throw new DataAccessResourceFailureException("Error retrieving database meta-data", ex);
	}
}
 

Example #23

/**
 * Create a {@link TableMetaDataProvider} based on the database meta-data.
 * @param dataSource used to retrieve meta-data
 * @param context the class that holds configuration and meta-data
 * @return instance of the TableMetaDataProvider implementation to be used
 */
public static TableMetaDataProvider createMetaDataProvider(DataSource dataSource, TableMetaDataContext context) {
	try {
		return (TableMetaDataProvider) JdbcUtils.extractDatabaseMetaData(dataSource, databaseMetaData -> {
			String databaseProductName =
					JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());
			boolean accessTableColumnMetaData = context.isAccessTableColumnMetaData();
			TableMetaDataProvider provider;

			if ("Oracle".equals(databaseProductName)) {
				provider = new OracleTableMetaDataProvider(
						databaseMetaData, context.isOverrideIncludeSynonymsDefault());
			}
			else if ("PostgreSQL".equals(databaseProductName)) {
				provider = new PostgresTableMetaDataProvider(databaseMetaData);
			}
			else if ("Apache Derby".equals(databaseProductName)) {
				provider = new DerbyTableMetaDataProvider(databaseMetaData);
			}
			else if ("HSQL Database Engine".equals(databaseProductName)) {
				provider = new HsqlTableMetaDataProvider(databaseMetaData);
			}
			else {
				provider = new GenericTableMetaDataProvider(databaseMetaData);
			}

			if (logger.isDebugEnabled()) {
				logger.debug("Using " + provider.getClass().getSimpleName());
			}
			provider.initializeWithMetaData(databaseMetaData);
			if (accessTableColumnMetaData) {
				provider.initializeWithTableColumnMetaData(databaseMetaData,
						context.getCatalogName(), context.getSchemaName(), context.getTableName());
			}
			return provider;
		});
	}
	catch (MetaDataAccessException ex) {
		throw new DataAccessResourceFailureException("Error retrieving database meta-data", ex);
	}
}
 

Example #24

@Override
public void initialize(ClassLoadHelper loadHelper, SchedulerSignaler signaler) throws SchedulerConfigException {
	// Absolutely needs thread-bound DataSource to initialize.
	this.dataSource = SchedulerFactoryBean.getConfigTimeDataSource();
	if (this.dataSource == null) {
		throw new SchedulerConfigException("No local DataSource found for configuration - " +
				"'dataSource' property must be set on SchedulerFactoryBean");
	}

	// Configure transactional connection settings for Quartz.
	setDataSource(TX_DATA_SOURCE_PREFIX + getInstanceName());
	setDontSetAutoCommitFalse(true);

	// Register transactional ConnectionProvider for Quartz.
	DBConnectionManager.getInstance().addConnectionProvider(
			TX_DATA_SOURCE_PREFIX + getInstanceName(),
			new ConnectionProvider() {
				@Override
				public Connection getConnection() throws SQLException {
					// Return a transactional Connection, if any.
					return DataSourceUtils.doGetConnection(dataSource);
				}
				@Override
				public void shutdown() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
				/* Quartz 2.2 initialize method */
				public void initialize() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
			}
	);

	// Non-transactional DataSource is optional: fall back to default
	// DataSource if not explicitly specified.
	DataSource nonTxDataSource = SchedulerFactoryBean.getConfigTimeNonTransactionalDataSource();
	final DataSource nonTxDataSourceToUse = (nonTxDataSource != null ? nonTxDataSource : this.dataSource);

	// Configure non-transactional connection settings for Quartz.
	setNonManagedTXDataSource(NON_TX_DATA_SOURCE_PREFIX + getInstanceName());

	// Register non-transactional ConnectionProvider for Quartz.
	DBConnectionManager.getInstance().addConnectionProvider(
			NON_TX_DATA_SOURCE_PREFIX + getInstanceName(),
			new ConnectionProvider() {
				@Override
				public Connection getConnection() throws SQLException {
					// Always return a non-transactional Connection.
					return nonTxDataSourceToUse.getConnection();
				}
				@Override
				public void shutdown() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
				/* Quartz 2.2 initialize method */
				public void initialize() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
			}
	);

	// No, if HSQL is the platform, we really don't want to use locks...
	try {
		String productName = JdbcUtils.extractDatabaseMetaData(this.dataSource, "getDatabaseProductName");
		productName = JdbcUtils.commonDatabaseName(productName);
		if (productName != null && productName.toLowerCase().contains("hsql")) {
			setUseDBLocks(false);
			setLockHandler(new SimpleSemaphore());
		}
	}
	catch (MetaDataAccessException ex) {
		logWarnIfNonZero(1, "Could not detect database type. Assuming locks can be taken.");
	}

	super.initialize(loadHelper, signaler);

}
 

Example #25

@Override
public void initialize(ClassLoadHelper loadHelper, SchedulerSignaler signaler)
		throws SchedulerConfigException {

	// Absolutely needs thread-bound DataSource to initialize.
	this.dataSource = SchedulerFactoryBean.getConfigTimeDataSource();
	if (this.dataSource == null) {
		throw new SchedulerConfigException(
			"No local DataSource found for configuration - " +
			"'dataSource' property must be set on SchedulerFactoryBean");
	}

	// Configure transactional connection settings for Quartz.
	setDataSource(TX_DATA_SOURCE_PREFIX + getInstanceName());
	setDontSetAutoCommitFalse(true);

	// Register transactional ConnectionProvider for Quartz.
	DBConnectionManager.getInstance().addConnectionProvider(
			TX_DATA_SOURCE_PREFIX + getInstanceName(),
			new ConnectionProvider() {
				@Override
				public Connection getConnection() throws SQLException {
					// Return a transactional Connection, if any.
					return DataSourceUtils.doGetConnection(dataSource);
				}
				@Override
				public void shutdown() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
				/* Quartz 2.2 initialize method */
				public void initialize() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
			}
	);

	// Non-transactional DataSource is optional: fall back to default
	// DataSource if not explicitly specified.
	DataSource nonTxDataSource = SchedulerFactoryBean.getConfigTimeNonTransactionalDataSource();
	final DataSource nonTxDataSourceToUse = (nonTxDataSource != null ? nonTxDataSource : this.dataSource);

	// Configure non-transactional connection settings for Quartz.
	setNonManagedTXDataSource(NON_TX_DATA_SOURCE_PREFIX + getInstanceName());

	// Register non-transactional ConnectionProvider for Quartz.
	DBConnectionManager.getInstance().addConnectionProvider(
			NON_TX_DATA_SOURCE_PREFIX + getInstanceName(),
			new ConnectionProvider() {
				@Override
				public Connection getConnection() throws SQLException {
					// Always return a non-transactional Connection.
					return nonTxDataSourceToUse.getConnection();
				}
				@Override
				public void shutdown() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
				/* Quartz 2.2 initialize method */
				public void initialize() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
			}
	);

	// No, if HSQL is the platform, we really don't want to use locks...
	try {
		String productName = JdbcUtils.extractDatabaseMetaData(this.dataSource, "getDatabaseProductName").toString();
		productName = JdbcUtils.commonDatabaseName(productName);
		if (productName != null && productName.toLowerCase().contains("hsql")) {
			setUseDBLocks(false);
			setLockHandler(new SimpleSemaphore());
		}
	}
	catch (MetaDataAccessException ex) {
		logWarnIfNonZero(1, "Could not detect database type. Assuming locks can be taken.");
	}

	super.initialize(loadHelper, signaler);

}
 

Example #26

/**
 * Create a CallMetaDataProvider based on the database metadata
 * @param dataSource used to retrieve metadata
 * @param context the class that holds configuration and metadata
 * @return instance of the CallMetaDataProvider implementation to be used
 */
static public CallMetaDataProvider createMetaDataProvider(DataSource dataSource, final CallMetaDataContext context) {
	try {
		return (CallMetaDataProvider) JdbcUtils.extractDatabaseMetaData(dataSource, new DatabaseMetaDataCallback() {
			@Override
			public Object processMetaData(DatabaseMetaData databaseMetaData) throws SQLException, MetaDataAccessException {
				String databaseProductName = JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());
				boolean accessProcedureColumnMetaData = context.isAccessCallParameterMetaData();
				if (context.isFunction()) {
					if (!supportedDatabaseProductsForFunctions.contains(databaseProductName)) {
						if (logger.isWarnEnabled()) {
							logger.warn(databaseProductName + " is not one of the databases fully supported for function calls " +
									"-- supported are: " + supportedDatabaseProductsForFunctions);
						}
						if (accessProcedureColumnMetaData) {
							logger.warn("Metadata processing disabled - you must specify all parameters explicitly");
							accessProcedureColumnMetaData = false;
						}
					}
				}
				else {
					if (!supportedDatabaseProductsForProcedures.contains(databaseProductName)) {
						if (logger.isWarnEnabled()) {
							logger.warn(databaseProductName + " is not one of the databases fully supported for procedure calls " +
									"-- supported are: " + supportedDatabaseProductsForProcedures);
						}
						if (accessProcedureColumnMetaData) {
							logger.warn("Metadata processing disabled - you must specify all parameters explicitly");
							accessProcedureColumnMetaData = false;
						}
					}
				}

				CallMetaDataProvider provider;
				if ("Oracle".equals(databaseProductName)) {
					provider = new OracleCallMetaDataProvider(databaseMetaData);
				}
				else if ("DB2".equals(databaseProductName)) {
					provider = new Db2CallMetaDataProvider((databaseMetaData));
				}
				else if ("Apache Derby".equals(databaseProductName)) {
					provider = new DerbyCallMetaDataProvider((databaseMetaData));
				}
				else if ("PostgreSQL".equals(databaseProductName)) {
					provider = new PostgresCallMetaDataProvider((databaseMetaData));
				}
				else if ("Sybase".equals(databaseProductName)) {
					provider = new SybaseCallMetaDataProvider((databaseMetaData));
				}
				else if ("Microsoft SQL Server".equals(databaseProductName)) {
					provider = new SqlServerCallMetaDataProvider((databaseMetaData));
				}
				else if ("HDB".equals(databaseProductName)) {
					provider = new HanaCallMetaDataProvider((databaseMetaData));
				}
				else {
					provider = new GenericCallMetaDataProvider(databaseMetaData);
				}
				if (logger.isDebugEnabled()) {
					logger.debug("Using " + provider.getClass().getName());
				}
				provider.initializeWithMetaData(databaseMetaData);
				if (accessProcedureColumnMetaData) {
					provider.initializeWithProcedureColumnMetaData(databaseMetaData,
							context.getCatalogName(), context.getSchemaName(), context.getProcedureName());
				}
				return provider;
			}
		});
	}
	catch (MetaDataAccessException ex) {
		throw new DataAccessResourceFailureException("Error retrieving database metadata", ex);
	}
}
 

Example #27

/**
 * Create a TableMetaDataProvider based on the database metadata.
 * @param dataSource used to retrieve metadata
 * @param context the class that holds configuration and metadata
 * @param nativeJdbcExtractor the NativeJdbcExtractor to be used
 * @return instance of the TableMetaDataProvider implementation to be used
 */
public static TableMetaDataProvider createMetaDataProvider(DataSource dataSource,
			final TableMetaDataContext context, final NativeJdbcExtractor nativeJdbcExtractor) {
	try {
		return (TableMetaDataProvider) JdbcUtils.extractDatabaseMetaData(dataSource,
				new DatabaseMetaDataCallback() {
					@Override
					public Object processMetaData(DatabaseMetaData databaseMetaData) throws SQLException {
						String databaseProductName =
								JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());
						boolean accessTableColumnMetaData = context.isAccessTableColumnMetaData();
						TableMetaDataProvider provider;
						if ("Oracle".equals(databaseProductName)) {
							provider = new OracleTableMetaDataProvider(databaseMetaData,
									context.isOverrideIncludeSynonymsDefault());
						}
						else if ("HSQL Database Engine".equals(databaseProductName)) {
							provider = new HsqlTableMetaDataProvider(databaseMetaData);
						}
						else if ("PostgreSQL".equals(databaseProductName)) {
							provider = new PostgresTableMetaDataProvider(databaseMetaData);
						}
						else if ("Apache Derby".equals(databaseProductName)) {
							provider = new DerbyTableMetaDataProvider(databaseMetaData);
						}
						else {
							provider = new GenericTableMetaDataProvider(databaseMetaData);
						}
						if (nativeJdbcExtractor != null) {
							provider.setNativeJdbcExtractor(nativeJdbcExtractor);
						}
						if (logger.isDebugEnabled()) {
							logger.debug("Using " + provider.getClass().getSimpleName());
						}
						provider.initializeWithMetaData(databaseMetaData);
						if (accessTableColumnMetaData) {
							provider.initializeWithTableColumnMetaData(databaseMetaData, context.getCatalogName(),
									context.getSchemaName(), context.getTableName());
						}
						return provider;
					}
				});
	}
	catch (MetaDataAccessException ex) {
		throw new DataAccessResourceFailureException("Error retrieving database metadata", ex);
	}
}
 

Example #28

/**
 * Create a CallMetaDataProvider based on the database metadata
 * @param dataSource used to retrieve metadata
 * @param context the class that holds configuration and metadata
 * @return instance of the CallMetaDataProvider implementation to be used
 */
static public CallMetaDataProvider createMetaDataProvider(DataSource dataSource, final CallMetaDataContext context) {
	try {
		return (CallMetaDataProvider) JdbcUtils.extractDatabaseMetaData(dataSource, new DatabaseMetaDataCallback() {
			@Override
			public Object processMetaData(DatabaseMetaData databaseMetaData) throws SQLException, MetaDataAccessException {
				String databaseProductName = JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());
				boolean accessProcedureColumnMetaData = context.isAccessCallParameterMetaData();
				if (context.isFunction()) {
					if (!supportedDatabaseProductsForFunctions.contains(databaseProductName)) {
						if (logger.isWarnEnabled()) {
							logger.warn(databaseProductName + " is not one of the databases fully supported for function calls " +
									"-- supported are: " + supportedDatabaseProductsForFunctions);
						}
						if (accessProcedureColumnMetaData) {
							logger.warn("Metadata processing disabled - you must specify all parameters explicitly");
							accessProcedureColumnMetaData = false;
						}
					}
				}
				else {
					if (!supportedDatabaseProductsForProcedures.contains(databaseProductName)) {
						if (logger.isWarnEnabled()) {
							logger.warn(databaseProductName + " is not one of the databases fully supported for procedure calls " +
									"-- supported are: " + supportedDatabaseProductsForProcedures);
						}
						if (accessProcedureColumnMetaData) {
							logger.warn("Metadata processing disabled - you must specify all parameters explicitly");
							accessProcedureColumnMetaData = false;
						}
					}
				}

				CallMetaDataProvider provider;
				if ("Oracle".equals(databaseProductName)) {
					provider = new OracleCallMetaDataProvider(databaseMetaData);
				}
				else if ("DB2".equals(databaseProductName)) {
					provider = new Db2CallMetaDataProvider((databaseMetaData));
				}
				else if ("Apache Derby".equals(databaseProductName)) {
					provider = new DerbyCallMetaDataProvider((databaseMetaData));
				}
				else if ("PostgreSQL".equals(databaseProductName)) {
					provider = new PostgresCallMetaDataProvider((databaseMetaData));
				}
				else if ("Sybase".equals(databaseProductName)) {
					provider = new SybaseCallMetaDataProvider((databaseMetaData));
				}
				else if ("Microsoft SQL Server".equals(databaseProductName)) {
					provider = new SqlServerCallMetaDataProvider((databaseMetaData));
				}
				else if ("HDB".equals(databaseProductName)) {
					provider = new HanaCallMetaDataProvider((databaseMetaData));
				}
				else {
					provider = new GenericCallMetaDataProvider(databaseMetaData);
				}
				if (logger.isDebugEnabled()) {
					logger.debug("Using " + provider.getClass().getName());
				}
				provider.initializeWithMetaData(databaseMetaData);
				if (accessProcedureColumnMetaData) {
					provider.initializeWithProcedureColumnMetaData(databaseMetaData,
							context.getCatalogName(), context.getSchemaName(), context.getProcedureName());
				}
				return provider;
			}
		});
	}
	catch (MetaDataAccessException ex) {
		throw new DataAccessResourceFailureException("Error retrieving database metadata", ex);
	}
}
 

Example #29

/**
 * Create a TableMetaDataProvider based on the database metedata
 * @param dataSource used to retrieve metedata
 * @param context the class that holds configuration and metedata
 * @param nativeJdbcExtractor the NativeJdbcExtractor to be used
 * @return instance of the TableMetaDataProvider implementation to be used
 */
public static TableMetaDataProvider createMetaDataProvider(DataSource dataSource,
			final TableMetaDataContext context, final NativeJdbcExtractor nativeJdbcExtractor) {
	try {
		return (TableMetaDataProvider) JdbcUtils.extractDatabaseMetaData(dataSource,
				new DatabaseMetaDataCallback() {
					@Override
					public Object processMetaData(DatabaseMetaData databaseMetaData) throws SQLException {
						String databaseProductName =
								JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());
						boolean accessTableColumnMetaData = context.isAccessTableColumnMetaData();
						TableMetaDataProvider provider;
						if ("Oracle".equals(databaseProductName)) {
							provider = new OracleTableMetaDataProvider(databaseMetaData,
									context.isOverrideIncludeSynonymsDefault());
						}
						else if ("HSQL Database Engine".equals(databaseProductName)) {
							provider = new HsqlTableMetaDataProvider(databaseMetaData);
						}
						else if ("PostgreSQL".equals(databaseProductName)) {
							provider = new PostgresTableMetaDataProvider(databaseMetaData);
						}
						else if ("Apache Derby".equals(databaseProductName)) {
							provider = new DerbyTableMetaDataProvider(databaseMetaData);
						}
						else {
							provider = new GenericTableMetaDataProvider(databaseMetaData);
						}
						if (nativeJdbcExtractor != null) {
							provider.setNativeJdbcExtractor(nativeJdbcExtractor);
						}
						if (logger.isDebugEnabled()) {
							logger.debug("Using " + provider.getClass().getSimpleName());
						}
						provider.initializeWithMetaData(databaseMetaData);
						if (accessTableColumnMetaData) {
							provider.initializeWithTableColumnMetaData(databaseMetaData, context.getCatalogName(),
									context.getSchemaName(), context.getTableName());
						}
						return provider;
					}
				});
	}
	catch (MetaDataAccessException ex) {
		throw new DataAccessResourceFailureException("Error retrieving database metadata", ex);
	}
}
 

Example #30

@Override
public void initialize(ClassLoadHelper loadHelper, SchedulerSignaler signaler)
		throws SchedulerConfigException {

	// Absolutely needs thread-bound DataSource to initialize.
	this.dataSource = SchedulerFactoryBean.getConfigTimeDataSource();
	if (this.dataSource == null) {
		throw new SchedulerConfigException(
			"No local DataSource found for configuration - " +
			"'dataSource' property must be set on SchedulerFactoryBean");
	}

	// Configure transactional connection settings for Quartz.
	setDataSource(TX_DATA_SOURCE_PREFIX + getInstanceName());
	setDontSetAutoCommitFalse(true);

	// Register transactional ConnectionProvider for Quartz.
	DBConnectionManager.getInstance().addConnectionProvider(
			TX_DATA_SOURCE_PREFIX + getInstanceName(),
			new ConnectionProvider() {
				@Override
				public Connection getConnection() throws SQLException {
					// Return a transactional Connection, if any.
					return DataSourceUtils.doGetConnection(dataSource);
				}
				@Override
				public void shutdown() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
				/* Quartz 2.2 initialize method */
				public void initialize() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
			}
	);

	// Non-transactional DataSource is optional: fall back to default
	// DataSource if not explicitly specified.
	DataSource nonTxDataSource = SchedulerFactoryBean.getConfigTimeNonTransactionalDataSource();
	final DataSource nonTxDataSourceToUse = (nonTxDataSource != null ? nonTxDataSource : this.dataSource);

	// Configure non-transactional connection settings for Quartz.
	setNonManagedTXDataSource(NON_TX_DATA_SOURCE_PREFIX + getInstanceName());

	// Register non-transactional ConnectionProvider for Quartz.
	DBConnectionManager.getInstance().addConnectionProvider(
			NON_TX_DATA_SOURCE_PREFIX + getInstanceName(),
			new ConnectionProvider() {
				@Override
				public Connection getConnection() throws SQLException {
					// Always return a non-transactional Connection.
					return nonTxDataSourceToUse.getConnection();
				}
				@Override
				public void shutdown() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
				/* Quartz 2.2 initialize method */
				public void initialize() {
					// Do nothing - a Spring-managed DataSource has its own lifecycle.
				}
			}
	);

	// No, if HSQL is the platform, we really don't want to use locks...
	try {
		String productName = JdbcUtils.extractDatabaseMetaData(this.dataSource, "getDatabaseProductName").toString();
		productName = JdbcUtils.commonDatabaseName(productName);
		if (productName != null && productName.toLowerCase().contains("hsql")) {
			setUseDBLocks(false);
			setLockHandler(new SimpleSemaphore());
		}
	}
	catch (MetaDataAccessException ex) {
		logWarnIfNonZero(1, "Could not detect database type. Assuming locks can be taken.");
	}

	super.initialize(loadHelper, signaler);

}
 

У меня есть микросервис, который после нескольких часов работы не может подключиться к базе данных со следующей ошибкой

Error retrieving database metadata; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.

Если я разверну его повторно, он сработает, и через несколько часов или несколько дней ошибка вернется.

Вот мой класс конфигурации подключения к базе данных (я использую 2 разных источника данных)

@Getter
@Configuration
public class ApiConfiguration {

    @Autowired
    private Environment env;

    @Value("${spring.datasource.url}")
    private String legacyURL;

    @Value("${spring.datasource.username}")
    private String legacyUsername;

    @Value("${spring.datasource.password}")
    private String legacyPassword;

    @Value("${spring.datasource.driverClassName}")
    private String legacyDriverClassName;

    @Bean(name = "legacyDataSource")
    @Primary
    public JdbcTemplate getLegacyJdbcTemplate() {
        DataSource ds = DataSourceBuilder.create()
                .url(legacyURL)
                .username(legacyUsername)
                .password(legacyPassword)
                .driverClassName(legacyDriverClassName)
                .build();
        return new JdbcTemplate(ds);
    }
}

Application.properties

# Legacy spring.datasource.url=jdbc:sqlserver://${DB_SERVER};PortNumber=${DB_PORT};failoverPartner=${DB_FAILOVER_SERVER};databaseName=${DB_NAME};applicationName=questions-and-answers-api;
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

Возможный дубликат Соединение потеряно в одночасье (весенняя загрузка + mysql)


— pvpkiran

20.03.2018 10:24


Ответы
1

Я думаю, что, возможно, из-за проблем с сетью ваше соединение с базой данных устарело. Попробуйте добавить следующие записи в application.properties:

spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 3600000
spring.datasource.validationQuery = SELECT 1

Это запустит фоновый поток в заданном интервале и проверит соединения с базой данных с помощью запроса проверки. Если запрос не выполняется успешно, он удаляет это соединение из пула.

Другие вопросы по теме

org.springframework.dao.DataAccessResourceFailureException: Error retrieving database metadata; nested exception is org.springframework.jdbc.support.MetaDataAccessException: JDBC DatabaseMetaData method not implemented by JDBC driver - upgrade your driver; nested exception is java.lang.AbstractMethodError: oracle.jdbc.driver.OracleDatabaseMetaData.supportsGetGeneratedKeys()Z
at org.springframework.jdbc.core.metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:102)
at org.springframework.jdbc.core.metadata.TableMetaDataContext.processMetaData(TableMetaDataContext.java:205)
at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compileInternal(AbstractJdbcInsert.java:276)
at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compile(AbstractJdbcInsert.java:263)
at org.springframework.jdbc.core.simple.AbstractJdbcInsert.checkCompiled(AbstractJdbcInsert.java:309)
at org.springframework.jdbc.core.simple.AbstractJdbcInsert.doExecute(AbstractJdbcInsert.java:346)
at org.springframework.jdbc.core.simple.SimpleJdbcInsert.execute(SimpleJdbcInsert.java:118)
at me.alad.storage.template.oracle.internal.OracleTemplateImpl.add(OracleTemplateImpl.java:84)
at me.alad.storage.template.oracle.internal.OracleTemplateImpl$$FastClassByCGLIB$$eb4b2f10.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:51)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
at me.alad.storage.template.oracle.internal.OracleTemplateImpl$$EnhancerByCGLIB$$76eaf33e.add(<generated>)

Решение: удалите class12.jar

/* * Copyright 2002-2020 the original author or authors. * * 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 * * https://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.springframework.jdbc.core.metadata; import java.util.Arrays; import java.util.List; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.jdbc.support.JdbcUtils; import org.springframework.jdbc.support.MetaDataAccessException; /** * Factory used to create a {@link CallMetaDataProvider} implementation * based on the type of database being used. * * @author Thomas Risberg * @author Juergen Hoeller * @since 2.5 */ public final class CallMetaDataProviderFactory { /** List of supported database products for procedure calls. */ public static final List<String> supportedDatabaseProductsForProcedures = Arrays.asList( «Apache Derby», «DB2», «Informix Dynamic Server», «MariaDB», «Microsoft SQL Server», «MySQL», «Oracle», «PostgreSQL», «Sybase» ); /** List of supported database products for function calls. */ public static final List<String> supportedDatabaseProductsForFunctions = Arrays.asList( «MariaDB», «Microsoft SQL Server», «MySQL», «Oracle», «PostgreSQL» ); private static final Log logger = LogFactory.getLog(CallMetaDataProviderFactory.class); private CallMetaDataProviderFactory() { } /** * Create a {@link CallMetaDataProvider} based on the database meta-data. * @param dataSource the JDBC DataSource to use for retrieving meta-data * @param context the class that holds configuration and meta-data * @return instance of the CallMetaDataProvider implementation to be used */ public static CallMetaDataProvider createMetaDataProvider(DataSource dataSource, final CallMetaDataContext context) { try { return JdbcUtils.extractDatabaseMetaData(dataSource, databaseMetaData -> { String databaseProductName = JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName()); boolean accessProcedureColumnMetaData = context.isAccessCallParameterMetaData(); if (context.isFunction()) { if (!supportedDatabaseProductsForFunctions.contains(databaseProductName)) { if (logger.isInfoEnabled()) { logger.info(databaseProductName + » is not one of the databases fully supported for function calls « + «— supported are: « + supportedDatabaseProductsForFunctions); } if (accessProcedureColumnMetaData) { logger.info(«Metadata processing disabled — you must specify all parameters explicitly»); accessProcedureColumnMetaData = false; } } } else { if (!supportedDatabaseProductsForProcedures.contains(databaseProductName)) { if (logger.isInfoEnabled()) { logger.info(databaseProductName + » is not one of the databases fully supported for procedure calls « + «— supported are: « + supportedDatabaseProductsForProcedures); } if (accessProcedureColumnMetaData) { logger.info(«Metadata processing disabled — you must specify all parameters explicitly»); accessProcedureColumnMetaData = false; } } } CallMetaDataProvider provider; if («Oracle».equals(databaseProductName)) { provider = new OracleCallMetaDataProvider(databaseMetaData); } else if («PostgreSQL».equals(databaseProductName)) { provider = new PostgresCallMetaDataProvider((databaseMetaData)); } else if («Apache Derby».equals(databaseProductName)) { provider = new DerbyCallMetaDataProvider((databaseMetaData)); } else if («DB2».equals(databaseProductName)) { provider = new Db2CallMetaDataProvider((databaseMetaData)); } else if («HDB».equals(databaseProductName)) { provider = new HanaCallMetaDataProvider((databaseMetaData)); } else if («Microsoft SQL Server».equals(databaseProductName)) { provider = new SqlServerCallMetaDataProvider((databaseMetaData)); } else if («Sybase».equals(databaseProductName)) { provider = new SybaseCallMetaDataProvider((databaseMetaData)); } else { provider = new GenericCallMetaDataProvider(databaseMetaData); } if (logger.isDebugEnabled()) { logger.debug(«Using « + provider.getClass().getName()); } provider.initializeWithMetaData(databaseMetaData); if (accessProcedureColumnMetaData) { provider.initializeWithProcedureColumnMetaData(databaseMetaData, context.getCatalogName(), context.getSchemaName(), context.getProcedureName()); } return provider; }); } catch (MetaDataAccessException ex) { throw new DataAccessResourceFailureException(«Error retrieving database meta-data», ex); } } }

Русские Блоги

Spring JDBC

Существует несколько вариантов базового доступа JDBC к базе данных с использованием Spring. Spring предоставляет по крайней мере три различных режима работы: JdbcTemplate, класс SimpleJdbc, недавно представленный в Spring 2.5, может лучше обрабатывать метаданные базы данных, также есть стиль объектно-ориентированной упаковки, называемый RDBMS Object, немного Похож на дизайн запросов JDO. Здесь мы кратко перечислим основные причины, по которым вы выбираете определенный метод работы, однако учтите, что даже если вы выберете один из режимов работы, вы все равно можете смешать любой другой режим в своем коде, чтобы получить его преимущества. Преимущества и преимущества. Для всех режимов работы требуется поддержка драйвера базы данных JDBC 2.0 или выше. Для некоторых расширенных функций может потребоваться поддержка драйвера базы данных JDBC 3.0 или выше.

JdbcTemplate — это классическое и наиболее часто используемое решение Spring для доступа к JDBC. Это также самый низкий уровень инкапсуляции.Другие рабочие режимы на самом деле используют JdbcTemplate в качестве базовой основы реализации внизу. JdbcTemplate отлично работает в средах выше JDK 1.4.

NamedParameterJdbcTemplate-инкапсулирует JdbcTemplate и предоставляет более удобный способ использования именованных параметров вместо «?» в качестве заполнителя для параметров. Этот метод более интуитивно понятен и прост в использовании, когда вам нужно указать много параметров для SQL. Эта функция должна работать на JDK 1.4 и выше.

SimpleJdbcTemplate — этот класс объединяет наиболее часто используемые функции JdbcTemplate и NamedParameterJdbcTemplate, а также использует некоторые функции Java 5, такие как обобщенные элементы, varargs и автобокс. Это обеспечивает более простой способ доступа к API. Нужно работать в среде Java 5 или выше.

SimpleJdbcInsert и SimpleJdbcCall. Эти два класса могут в полной мере использовать характеристики метаданных базы данных для упрощения настройки. Используя эти два класса для программирования, вы можете просто указать имя таблицы базы данных или хранимой процедуры и карту в качестве параметров. Ключ Map должен соответствовать полям в таблице базы данных. Эти два класса обычно используются вместе с SimpleJdbcTemplate. Эти два класса должны работать на JDK 5 и выше, а база данных должна предоставлять достаточную информацию метаданных.

Объекты RDBMS включают MappingSqlQuery, SqlUpdate и StoredProcedure — таким образом, вы можете создавать повторно используемые и потокобезопасные объекты при инициализации уровня доступа к данным. Этот объект моделируется после того, как вы определили свой запрос, объявили параметры запроса и скомпилировали соответствующий запрос. Как только моделирование завершено, любая исполнительная функция может вызываться несколько раз с различными параметрами. Этот метод должен работать на JDK 1.4 и выше.

Структура исключений выглядит следующим образом:

SQLExceptionTranslator — это интерфейс. Если вам нужно выполнить преобразование между SQLException и org.springframework.dao.DataAccessException, вы должны реализовать этот интерфейс. Реализация класса конвертера может принять общую практику (такую ​​как использование кода SQLState JDBC), если вы хотите сделать преобразование более точным, вы также можете настроить (например, использовать код ошибки Oracle).

SQLErrorCodeSQLExceptionTranslator является реализацией SQLExceptionTranslator по умолчанию. Эта реализация использует код ошибки указанного поставщика базы данных и является более точной, чем использование SQLState. Процесс преобразования основан на коде ошибки в JavaBean (типа SQLErrorCodes). Этот JavaBean создается классом фабрики SQLErrorCodesFactory, а его содержимое берется из файла конфигурации «sql-error-codes.xml». Код поставщика базы данных в этом файле основан на DatabaseProductName в информации метаданных базы данных, что соответствует использованию текущей базы данных.

SQLErrorCodeSQLExceptionTranslator использует следующие правила соответствия:

Сначала проверьте, есть ли реализация подкласса, которая завершает пользовательское преобразование. Обычно класс SQLErrorCodeSQLExceptionTranslator может использоваться как конкретный класс без настройки, поэтому это правило не будет применяться.

Затем сопоставьте код ошибки SQLException с кодом ошибки в наборе кодов ошибок. По умолчанию набор кодов ошибок будет взят из SQLErrorCodesFactory. Набор кодов ошибок происходит из файла sql-error-codes.xml под classpath, который будет сопоставлен с именем базы данных в информации метаданных базы данных.

Используйте запасной переводчик. Класс SQLStateSQLExceptionTranslator является резервным переводчиком по умолчанию.

Интерфейс NamespaceHandler. DefaultBeanDefinitionDocumentReader использует этот интерфейс для обработки пользовательских пространств имен в XML-файле конфигурации Spring.

EmbeddedDatabaseBeanDefinitionParser расширяет AbstractBeanDefinitionParser, анализирует элемент и использует EmbeddedDatabaseFactoryBean для создания BeanDefinition. Кстати, представьте используемый пакет org.w3c.dom.

Пакет программного обеспечения org.w3c.dom. Предоставляет интерфейс для объектной модели документов (DOM), которая является компонентным API для API Java для обработки XML. Базовый API уровня 2 объектной модели документа позволяет программам динамически получать доступ и обновлять содержимое и структуру документов.

Attr: Интерфейс Attr представляет свойство в объекте Element.
CDATASectionРаздел CDATA используется для экранирования текстовых блоков, которые содержат символы, которые рассматриваются как токены, если они не экранированы.
CharacterData: Интерфейс CharacterData расширяет узлы набором атрибутов и методов для доступа к символьным данным в DOM.
Comment: Этот интерфейс наследует содержимое комментария представления CharacterData, то есть все символы между началом « ».
Document: Интерфейс документа представляет весь документ HTML или XML.
DocumentFragment: DocumentFragment является «легким» или «минимальным» объектом Document.
DocumentTypeКаждый документ имеет атрибут doctype, значение которого может быть нулевым или объект DocumentType.
DOMConfiguration: Интерфейс DOMConfiguration представляет конфигурацию документа и поддерживает распознаваемый список параметров.
DOMError: DOMError — это интерфейс, описывающий ошибки.
DOMErrorHandler: DOMErrorHandler — это интерфейс обратного вызова, который реализация DOM может вызывать при сообщении об ошибке, возникающей при обработке данных XML или во время какой-либо другой обработки, например проверки документа.
DOMImplementationИнтерфейс DOMImplementation предоставляет множество методов для выполнения операций, которые не зависят от какого-либо конкретного экземпляра объектной модели документа.
DOMImplementationList: Интерфейс DOMImplementationList предоставляет абстракцию упорядоченной коллекции, реализованной DOM, без определения или ограничения способов реализации этой коллекции.
DOMImplementationSource: Этот интерфейс позволяет разработчику DOM предоставлять одну или несколько реализаций на основе запрошенной функции и версии, как описано ниже.
DOMLocator: DOMLocator — это интерфейс, который описывает местоположение, например, где произошла ошибка.
DOMStringList: Интерфейс DOMStringList обеспечивает абстракцию упорядоченной коллекции значений DOMString, не определяя и не ограничивая способ реализации этой коллекции.
Element: Интерфейс Element представляет элемент в документе HTML или XML.
Entity: Этот интерфейс представляет известные сущности, которые анализируются и не анализируются в документах XML.
EntityReference: Узел EntityReference можно использовать для представления ссылок на сущности в дереве.
NamedNodeMap: Объект, который реализует интерфейс NamedNodeMap, используется для представления набора узлов, к которым можно получить доступ по имени.
NameListИнтерфейс NameList обеспечивает абстракцию упорядоченной коллекции пар параллельных имен и значений пространства имен (которые могут быть нулевыми значениями) без определения или ограничения способа реализации этой коллекции.
Node: Интерфейс узла является основным типом данных для всей объектной модели документа.
NodeList: Интерфейс NodeList обеспечивает абстракцию упорядоченной коллекции узлов, не определяя и не ограничивая, как реализовать эту коллекцию.
Notation: Этот интерфейс представляет нотацию, объявленную в DTD.
ProcessingInstructionИнтерфейс ProcessingInstruction расшифровывается как «Инструкция обработки», которая используется в XML как способ сохранения информации о процессоре в тексте документа.
Text: Текстовый интерфейс наследуется от CharacterData и представляет текстовое содержимое элемента или Attr (так называемые символьные данные в XML).
TypeInfoИнтерфейс TypeInfo представляет тип, на который ссылается узел Element или Attr, указанный с помощью шаблона, связанного с документом.
UserDataHandler: При использовании Node.setUserData () для связывания объекта с ключом на узле приложение может предоставить обработчик для вызова при клонировании, импорте или переименовании узла, связанного с объектом.

3. Основной модуль

3.1 NativeJdbcExtractor извлекает локальный объект jdbc из инкапсулированных объектов в пуле потоков, и его структура выглядит следующим образом:

Приведенный выше код получает соединение путем вызова API-интерфейса rawConnectionOperation C3P0 и использует метод обратного вызова getRawConnection для получения собственного соединения (C3P0 напрямую не поддерживает собственное соединение).

NativeJdbcExtractorAdapter — это простая реализация NativeJdbcExtractor, метод getNativeConnection () проверяет цепочку ConnectionProxy и проксирует метод doGetNativeConnection. TransactionAwareDataSourceProxy и LazyConnectionDataSourceProxy в Spring используют ConnectionProxy. Целевое соединение помещается в локальный пул соединений, а метод doGetNativeConnection, реализованный подклассом, удаляет инкапсуляцию для получения собственного соединения. Реализация заключается в следующем:

3.3 Модуль метаданных

В этом разделе пружина применяется к заводскому режиму, который можно более конкретно понять, комбинируя код.

CallMetaDataProviderFactory создает класс фабрики для CallMetaDataProvider со следующим кодом:

TableMetaDataProviderFactory создает фабричный класс TableMetaDataProvider, и процесс его создания выглядит следующим образом:

3.4 Используйте SqlParameterSource для предоставления значений параметров
Использование Map для задания значений параметров иногда работает очень хорошо, но это не самый простой способ его использования. Spring предоставляет некоторые другие классы реализации SqlParameterSource для указания значений параметров. Сначала мы можем взглянуть на класс BeanPropertySqlParameterSource, который является очень простым классом реализации для указания параметров, если у вас есть класс, соответствующий спецификации JavaBean. Он будет использовать метод getter для получения значения параметра.

SqlParameter инкапсулирует объект, который определяет параметр sql.

Классы обратного вызова CallableStateMentCallback, PrePareStateMentCallback, StateMentCallback и ConnectionCallback соответствуют различным методам обработки в JdbcTemplate соответственно.

3.5 простая реализация

Spring получает соединение с базой данных через DataSource. Источник данных является частью спецификации jdbc, он получен через ConnectionFactory. Контейнер и инфраструктура могут скрывать пулы соединений и управление транзакциями на уровне кода приложения.

Используя уровень jdbc в Spring, вы можете получить DataSource через JNDI, или вы можете получить его через сторонний пул соединений, который вы настраиваете самостоятельно. Популярные сторонние реализации сделаны Apache Jakarta Commons dbcp и c3p0.

TransactionAwareDataSourceProxy действует как прокси-сервер для целевого источника данных. Оборачивая целевой источник данных, он также добавляет возможности управления транзакциями Spring. На этом этапе функция этого класса очень похожа на транзакционный JNDI-источник данных, предоставляемый сервером J2EE.

Note
Этот класс используется редко, если только существующий код не требует стандартной реализации интерфейса JDBC DataSource в качестве параметра при его вызове. В этом случае этот класс позволяет существующему коду участвовать в управлении транзакциями Spring. Обычно рекомендуется использовать высокоуровневые абстракции для управления источниками данных, такими как JdbcTemplate и DataSourceUtils.

Примечание. DriverManagerDataSource ограничен тестовым использованием, так как он не предоставляет возможности пула, что может привести к снижению производительности при получении нескольких запросов на подключение.

5. объектный модуль

6. JdbcTemplate является базовым классом базового пакета.

Он завершает создание и выпуск ресурсов для нас, тем самым упрощая наше использование JDBC. Это также помогает нам избежать некоторых распространенных ошибок, например, забыть закрыть соединение с базой данных. JdbcTemplate завершит поток обработки ядра JDBC, такой как создание и выполнение операторов SQL, и оставит генерацию операторов SQL и извлечение результатов запроса в код нашего приложения. Он может выполнять SQL-запросы, обновления и вызывать хранимые процедуры, а также просматривать и извлекать ResultSet. Он также может перехватывать исключения JDBC и преобразовывать их в общие, более информативные исключения, определенные в пакете org.springframework.dao.

Кодирование с помощью JdbcTemplate необходимо только для реализации интерфейса обратного вызова в соответствии с четко определенным набором контрактов. Интерфейс обратного вызова PreparedStatementCreator создает PreparedStatement для данного Соединения, содержащий SQL и любые связанные параметры. CallableStatementCreateor реализует тот же процесс, за исключением того, что он создает CallableStatement. Интерфейс RowCallbackHandler извлекает значения из каждой строки набора данных.

Мы можем создать экземпляр JdbcTemplate, передав ссылку на DataSource в класс реализации DAO, или мы можем сконфигурировать bean-компонент JdbcTemplate в контейнере Spring IoC и предоставить класс реализации DAO в качестве экземпляра. , Следует отметить, что DataSource всегда настроен как компонент в контейнере IoC Spring.В первом случае компонент DataSource передается службе, а во втором случае компонент DataSource передается компоненту JdbcTemplate.

7. Класс NamedParameterJdbcTemplate добавляет поддержку функций для именованных параметров для операций JDBC вместо традиционного использования (‘?’) В качестве заполнителя для параметров. Класс NamedParameterJdbcTemplate инкапсулирует класс JdbcTemplate. Под капотом JdbcTemplate выполняет большую часть работы.

Традиционная операция JDBC над базой данных содержит много повторяющегося кода, что создает большую дополнительную нагрузку для программиста. Spring предоставляет шаблон JDBC для решения этой проблемы очень хорошо. Поскольку традиционный метод относительно прост, он не Представлено, давайте поговорим о шаблонах напрямую.

Используйте шаблон JDBC:

Среда Spring JDBC может взять на себя работу по управлению ресурсами и обработке исключений. Для JDBC Spring предоставляет 3 класса шаблонов

  • JdbcTemplate: самый простой шаблон JDBC в Spring, использующий JDBC и простой запрос параметров индекса для обеспечения простого доступа к базе данных.
  • NamedParameterJdbcTemplate: возможность привязывать значения к именованным параметрам в SQL при выполнении запросов вместо использования параметров индекса.
  • SimpleJdbcTemplate: используйте преимущества функций Java 5, таких как автобокс, универсальные таблицы и таблицы классов переменных параметров, для упрощения использования шаблонов JDBC.

Источник

Я получаю следующие ошибки

Exception in thread "main" org.springframework.dao.DataAccessResourceFailureException: Error retrieving database metadata; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Client does not support authentication protocol requested by server; consider upgrading MySQL client)
    at org.springframework.jdbc.core.metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:103)
    at org.springframework.jdbc.core.metadata.TableMetaDataContext.processMetaData(TableMetaDataContext.java:205)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compileInternal(AbstractJdbcInsert.java:276)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compile(AbstractJdbcInsert.java:263)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.checkCompiled(AbstractJdbcInsert.java:309)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.doExecuteAndReturnKey(AbstractJdbcInsert.java:369)
    at org.springframework.jdbc.core.simple.SimpleJdbcInsert.executeAndReturnKey(SimpleJdbcInsert.java:133)
    at sample.spring.chapter07.bankapp.dao.BankAccountDaoImpl.createBankAccount(BankAccountDaoImpl.java:35)
    at sample.spring.chapter07.bankapp.service.BankAccountServiceImpl.createBankAccount(BankAccountServiceImpl.java:17)
    at sample.spring.chapter07.bankapp.BankApp.main(BankApp.java:28)
Caused by: org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Client does not support authentication protocol requested by server; consider upgrading MySQL client)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:293)
    at org.springframework.jdbc.core.metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:63)
    ... 9 more

Когда я пытаюсь выполнить следующий основной файл

package sample.spring.chapter07.bankapp;

import java.util.Date;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import sample.spring.chapter07.bankapp.domain.BankAccountDetails;
import sample.spring.chapter07.bankapp.domain.FixedDepositDetails;
import sample.spring.chapter07.bankapp.service.BankAccountService;
import sample.spring.chapter07.bankapp.service.FixedDepositService;

public class BankApp {
    private static Logger logger = Logger.getLogger(BankApp.class);

    public static void main(String args[]) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "classpath:META-INF/spring/applicationContext.xml");

        BankAccountService bankAccountService = context
                .getBean(BankAccountService.class);
        BankAccountDetails bankAccountDetails = new BankAccountDetails();
        bankAccountDetails.setBalanceAmount(1000);
        bankAccountDetails.setLastTransactionTimestamp(new Date());

        int bankAccountId = bankAccountService
                .createBankAccount(bankAccountDetails);

        logger.info("Created bank account with id - " + bankAccountId);

        FixedDepositService fixedDepositService = context
                .getBean(FixedDepositService.class);

        FixedDepositDetails fdd = new FixedDepositDetails();
        fdd.setActive("Y");
        fdd.setBankAccountId(bankAccountId);
        fdd.setFdCreationDate(new Date());
        fdd.setFdAmount(500);
        fdd.setTenure(12);
        int fixedDepositId = fixedDepositService.createFixedDeposit(fdd);
        logger.info("Created fixed deposit with id - " + fixedDepositId);

        logger.info(fixedDepositService.getFixedDeposit(fixedDepositId));
    }
}

Это файл контекста приложения

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
               xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd  http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/jee
               http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
        ">

    <context:component-scan base-package="sample.spring.chapter07.bankapp" />

    <context:property-placeholder
        location="classpath*:META-INF/spring/database.properties" />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="namedJdbcTemplate"
        class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <constructor-arg index="0" ref="dataSource" />
    </bean>

    <bean class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" id="dataSource">
        <property name="driverClassName" value="${database.driverClassName}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
    </bean>

    <tx:annotation-driven transaction-manager="txManager" />

    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>

А это файл database.properties

database.driverClassName=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/spring_bank_app_db
database.username=root
database.password=root

Что не так с этим кодом?

1 ответ

Лучший ответ

Вы используете старую версию MySQL — JDBC jar-версию, которая несовместима с установленным сервером MySQL. Обновите банку до последней версии (8.x.x).

Если вы используете Maven, добавьте зависимость к pom.xml:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.x.x</version>
</dependency>

Или загрузите банку с здесь.


1

Anish B.
2 Ноя 2019 в 20:17

Понравилась статья? Поделить с друзьями:
  • Error required files are missing
  • Error required container mesh table is missing
  • Error require is not defined no undef
  • Error requested wal segment has already been removed
  • Error retrieving data from port 253 сбербанк