项目好的设计思路_使用XML_数据源

本文 主要是关注一个好的设计思路

 用XML配置SQL对象、用XML配置SQL语句、封装数据层、获取数据源、加载外部资源

 在应用加载时 加载SQL语句、SQL对象放在内存中 使用的时候 从内存中获取 加快查询速度

在应用加载时 加载外部配置资源  放在内存中 使用的时候 从内存中加载

在应用加载时 加载数据源 


在应用加载时  在web.xml文件中 配置Servlet进行加载外部资源、数据源等

<servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>InitDbQueryServlet</servlet-name>
    <servlet-class>com.undergrowth.db.servlet.InitDbQueryServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

在InitDbQueryServlet的init方法中 进行加载外部资源和数据源等

public void init() throws ServletException {
		// Put your code here
		//加载资源
		DataSourceResourceUtil.loadResource(this.getServletConfig());
		DataSourceResourceUtil.loadSqlFromXml(this.getServletConfig());
		//加载系统外部配置资源
		SystemUtils.loadApplicationConfig();
		//加载数据源
		OracleDbAssist.getInstance();
		System.out.println("成功加载资源和数据源");
	}


加载SQL配置相关类‘

package com.undergrowth.db.resource;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletConfig;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.undergrowth.db.DBQuery;

/**
 * 用于加载数据相关的配置SQL
 * @author undergrowth
 *
 */
public class DataSourceResourceUtil {

	private static Logger logger = LogManager.getLogger(DataSourceResourceUtil.class);
	private static Map<String, DBQuery> dbQueryColls = new HashMap<String, DBQuery>();

	private DataSourceResourceUtil() {
	}

	public static Map<String, DBQuery> getDbQueryColls() {
		return dbQueryColls;
	}

	/**
	 * 加载配置SQL对象
	 * @param servletConfig
	 */
	public static void loadResource(ServletConfig servletConfig) {
		InputStream is = null;
		try {
			dbQueryColls.clear();
			//加载位于/WEB-INF/dbquery/目录下的SQL配置文件
			Set resourceSet = servletConfig.getServletContext()
					.getResourcePaths("/WEB-INF/dbquery/");
			Iterator resources = resourceSet.iterator();
			logger.info("加载SQL对象,共有" + resourceSet.size());
			//对每一个配置文件进行迭代  提取出SQL配置对象
			while (resources.hasNext()) {
				String fileName = (String) resources.next();
				// ResourceQuery resourceQuery=new ResourceQuery(fileName);
				is = servletConfig.getServletContext().getResourceAsStream(
						fileName);
				// is=resourceQuery.getInputStream();
				addToColls(is);
				logger.info("加载SQL对象,为" + fileName);
			}
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 将加载到的SQL对象存放在内存中 便于后续的查询使用
	 * @param is
	 */
	private static void addToColls(InputStream is) {
		// TODO Auto-generated method stub
		QueryXmlResource xmlResource = new QueryXmlResource();
		List<DBQuery> dbList = xmlResource.unmarshalQuery(is);
		for (Iterator iterator = dbList.iterator(); iterator.hasNext();) {
			DBQuery db = (DBQuery) iterator.next();
			if (!dbQueryColls.containsKey(db.getQueryName())) {
				dbQueryColls.put(db.getQueryName(), db);
			}
		}
	}

	/**
	 * 加载配置的SQL语句
	 * @param servletConfig
	 */
	public static void loadSqlFromXml(ServletConfig servletConfig) {
		InputStream inputStream = null;
		String xml = "/WEB-INF/dbquery/logging_sql.xml";
		inputStream = servletConfig.getServletContext()
				.getResourceAsStream(xml);
		try {
			SAXReader reader = new SAXReader();
			Document document = reader.read(inputStream);
			Element root = document.getRootElement();
			List dataSetList = root.elements("statement");
			if ((null != dataSetList) && (dataSetList.size() > 0)) {
				Iterator it = dataSetList.iterator();
				Element element;
				String name;
				String statement;
				while (it.hasNext()) {
					element = (Element) it.next();
					name = element.attributeValue("name");
					statement = element.getTextTrim();
					//System.out.println(name+"\t"+statement);
					logger.info("加载配置的SQL语句,名称为"+name+"\t"+"语句为"+statement);
				}
			}
			inputStream.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}




Xml的资源查询器

package com.undergrowth.db.resource;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.xerces.parsers.SAXParser;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.undergrowth.db.DBQuery;


/**
 * 从xml文件中加载资源 并进行解析
 * @author undergrowth
 *
 */
public class QueryXmlResource {

	public List<DBQuery> unmarshalQuery(InputStream is){
		QueryXmlBuilder queryBuilder=new QueryXmlBuilder();
		//使用sax解析器进行解析资源
		SAXParser saxParser = new SAXParser();
		saxParser.setContentHandler(queryBuilder);
		try {
			saxParser.parse(new InputSource(is));
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return queryBuilder.getQueryList();
	}
	
	
}


Xml资源解析器

package com.undergrowth.db.resource;

import java.io.CharArrayWriter;
import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.undergrowth.db.DBQuery;


/**
 * Xml的自定义解析器
 * @author undergrowth
 *
 */
public class QueryXmlBuilder extends DefaultHandler{
	
	private DBQuery dbQuery;
	private CharArrayWriter contents ;
	private QueryXmlStore queryList;

	
	public QueryXmlBuilder(){
		contents = new CharArrayWriter();
		queryList=new QueryXmlStore();
	}
	
	public List<DBQuery> getQueryList(){
		return queryList.getQueryList();
	}

	
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		contents.write(ch, start, length);
	}



	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		// TODO Auto-generated method stub
		if("query".equals(localName)){
			dbQuery.setQueryStatement(contents.toString());
		}
		if("DBQuery".equals(localName)){
			queryList.getQueryList().add(dbQuery);
		}
		
	}

	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		if("DBQuery".equals(localName)){
		  dbQuery=new DBQuery();
		  //获取属性值
		  dbQuery.setQueryName(attributes.getValue("queryName"));
		}
	}
	
	
	
}



加载外部资源的工具类


package com.undergrowth.tool;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

/**
 * 系统工具类
 * 加载外部资源
 * @author undergrowth
 *
 */
public class SystemUtils {

	private static Logger logger = LogManager.getLogger(SystemUtils.class);
	private static final Map<String, String> configProperties=new HashMap<String, String>();
	
	/**
	 * 加载系统外部配置资源
	 */
	public  static void loadApplicationConfig() {
		// TODO Auto-generated method stub
		Properties properties = new Properties();
		try {
			InputStream is =  SystemUtils.class.getClassLoader().getResourceAsStream(
			"application.properties");
			properties.load(is);
			for (Map.Entry<Object, Object> property : properties.entrySet()) {
				configProperties.put((String)property.getKey(), (String)property.getValue());
			}
			logger.info("加载系统外部配置资源,总共有"+configProperties.size());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 获取对应key的配置名
	 * @param key
	 * @return
	 */
	public static String getConfigPropertiesByKey(String key) {
		return configProperties.get(key);
	}
	
	
}


数据层辅助类

执行SQL、函数、存储过程、XML

package com.undergrowth.db;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Hashtable;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import oracle.xml.sql.query.OracleXMLQuery;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import com.undergrowth.tool.SystemUtils;

/**
 * 连接oracle数据库的辅助类 单例模式构建
 * 
 * @author undergrowth
 * 
 */
public class OracleDbAssist {

	private static Logger logger = LogManager.getLogger(OracleDbAssist.class);

	private DataSource dataSource;
	private Connection conn;
	private Statement stmt;
	private ResultSet rs;
	private PreparedStatement ps;
	private CallableStatement cs;

	private OracleDbAssist() {
	}

	// 使用volatile关键字 保证在多个线程中获取oDbAssist无误
	private volatile static OracleDbAssist oDbAssist = null;

	/**
	 * 双层锁
	 * 
	 * @return
	 */
	public static OracleDbAssist getInstance() {
		if (oDbAssist == null) {
			synchronized (OracleDbAssist.class) {
				if (oDbAssist == null) {
					oDbAssist = new OracleDbAssist();
					oDbAssist.getDataSourceByJndi("SJPC");
				}
			}
		}
		return oDbAssist;
	}

	public DataSource getDataSource() {
		return dataSource;
	}

	public Connection getConn() {
		return conn;
	}

	public void setConn(Connection conn) {
		this.conn = conn;
	}

	public Statement getStmt() {
		return stmt;
	}

	public void setStmt(Statement stmt) {
		this.stmt = stmt;
	}

	public ResultSet getRs() {
		return rs;
	}

	public void setRs(ResultSet rs) {
		this.rs = rs;
	}

	/**
	 * 通过jndi从weblogic里面获取数据源
	 * 
	 * @return boolean flag 用于标示是否获取到数据源
	 */
	private boolean getDataSourceByJndi(String jndiDataSource) {
		boolean flag = false;
		String type = SystemUtils.getConfigPropertiesByKey("database_type");
		if ("oracle".equals(type)) {
			// 提供初始化jndi上下文的参数
			Hashtable<String, String> env = new Hashtable<String, String>();
			// 初始化工厂
			env.put(Context.INITIAL_CONTEXT_FACTORY,
					"weblogic.jndi.WLInitialContextFactory");
			env.put(Context.PROVIDER_URL, "t3://localhost:7001");
			try {
				Context ctx = new InitialContext(env);
				dataSource = (DataSource) ctx.lookup(jndiDataSource);
				flag = true;
				logger.info("成功获取数据源!!");
			} catch (NamingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				logger.error("加载数据源失败!!");
			}
		} else if ("tomcat".equals(type)) {
			try {
				Context context = new InitialContext();
				Context envContext = (Context) context.lookup("java:/comp/env");
				dataSource = (DataSource) envContext.lookup(jndiDataSource);
				flag = true;
				logger.info("成功获取数据源!!");
			} catch (NamingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return flag;
	}

	

	/**
	 * 获取数据连接
	 * 
	 * @return
	 * @throws SQLException
	 */
	public Connection getConnection() throws SQLException {
		if (getConn() == null)
			conn = dataSource.getConnection();
		return getConn();
	}

	/**
	 * 执行sql查询
	 * 
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public ResultSet executeQuery(String sql) throws SQLException {
		stmt = getConnection().createStatement();
		rs = stmt.executeQuery(sql);
		return rs;
	}

	/**
	 * 
	 * @param name
	 *            存储过程或者函数的名称
	 * @param param
	 *            参数列表
	 * @param flag
	 *            存储过程(1) 或者函数(0)
	 * @return
	 */
	public String executeProce(String name, List params, boolean flag) {
		String result = "";
		if (flag) { //存储过程
			String procedure = "{  call " + name;
			String tempStr = "";
			if (params != null && params.size() > 0) { 
				for (int i = 0; i <= params.size(); i++) {
					if (i == 0)
						tempStr = " ( ? ";
					else
						tempStr = tempStr + ", ?";
				}

				tempStr = tempStr + " ) ";
			}
			procedure = procedure + tempStr + " }";
			try {
				cs = getConnection().prepareCall(procedure);
				cs.registerOutParameter(1, Types.VARCHAR);  
				setParamValue(cs, params);
				cs.execute();  
				result = cs.getString(1);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {//函数
			String procedure = "{ ?= call " + name;
			String tempStr = "";
			if (params != null && params.size() > 0) {
				for (int i = 0; i < params.size(); i++) {
					if (i == 0)
						tempStr = " ( ? ";
					else
						tempStr = tempStr + ", ?";
				}

				tempStr = tempStr + " ) ";
			}
			procedure = procedure + tempStr + " }";
			try {
				cs = getConnection().prepareCall(procedure);
				cs.registerOutParameter(1, Types.VARCHAR);  
				setParamValue(cs, params);
				cs.execute();  
				result = cs.getString(1);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result;
	}
	
	private void setParamValue(PreparedStatement theStmt, List params)
	{
		for (int i = 0; i < params.size(); i++)
			try {
				theStmt.setObject(i + 2, params.get(i));
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
	/**
	 * 执行xml查询
	 * @param sql
	 * @return
	 */
	public  String executeXmlQuery(String  sql){
		
		try {
			OracleXMLQuery xmlQuery=new OracleXMLQuery(getConnection(),sql);
			xmlQuery.setRowsetTag("tables");
			xmlQuery.setRowTag("table");
			xmlQuery.useNullAttributeIndicator(true);
			xmlQuery.setDateFormat("yyyy-mm-dd");
			xmlQuery.setEncoding("utf-8");
			return xmlQuery.getXMLString();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
}


模拟的执行类

package com.undergrowth.db.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import com.undergrowth.db.DBQuery;
import com.undergrowth.db.OracleDbAssist;
import com.undergrowth.db.resource.DataSourceResourceUtil;
import com.undergrowth.tool.SystemUtils;

/**
 * 模拟的执行
 * 包括执行SQL语句、返回Xml结果集、执行存储过程、执行函数、输出到文件中
 * @author undergrowth
 *
 */
public class SimulateV2Query {

	private static int count = 0;

	/**
	 * 从内存中获取指定的SQL语句进行查询 将查询结构写入到文件中
	 * 
	 * @param args
	 */
	public static void executeSQL() {
		// TODO Auto-generated method stub
		OracleDbAssist dbAssist = OracleDbAssist.getInstance();
		ResultSet rs = null;
		try {
			DBQuery dbQuery = DataSourceResourceUtil.getDbQueryColls().get(
					"TEST_NOLOGGING2");
			if (dbQuery != null) {
				rs = dbAssist.executeQuery(dbQuery.getQueryStatement());
				iteratorRs(rs);
			} else {
				System.out.println("无法获取数据集");
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 执行SQL语句,输出XML文件
	 */
	public static void executeSqlXml() {
		OracleDbAssist dbAssist = OracleDbAssist.getInstance();

		DBQuery dbQuery = DataSourceResourceUtil.getDbQueryColls().get(
				"TEST_NOLOGGING2");
		if (dbQuery != null) {
			String resultString = dbAssist.executeXmlQuery(dbQuery
					.getQueryStatement());
			writeStringToFile(new StringBuilder(resultString));
		} else {
			System.out.println("无法获取数据集");
		}

	}

	/**
	 * 执行存储过程
	 * test_simulate_v2_pro(result_info out varchar2,name in varchar2,age in int)
	 */
	public static void executeProcedure() {
		OracleDbAssist dbAssist = OracleDbAssist.getInstance();
		List params = new ArrayList();
		params.add("模拟V2");
		params.add(100);
		String resultString = dbAssist.executeProce("test_simulate_v2_pro",
				params, true);
		System.out.println("执行存储过程-->"+resultString);

	}

	/**
	 * 执行函数
	 * test_simulate_v2_func(Name in varchar2, age in int) return varchar2 is
	Result varchar2(100)
	 */
	public static void executeFunction() {
		OracleDbAssist dbAssist = OracleDbAssist.getInstance();
		List params = new ArrayList();
		params.add("模拟V2");
		params.add(100);
		String resultString = dbAssist.executeProce("test_simulate_v2_func",
				params, false);
		System.out.println("执行函数-->"+resultString);

	}

	/**
	 * 迭代结果集
	 * 
	 * @param rs
	 * @throws SQLException
	 */
	private static void iteratorRs(ResultSet rs) throws SQLException {
		// TODO Auto-generated method stub
		StringBuilder builder = new StringBuilder();
		count = 0;
		ResultSetMetaData metaData = rs.getMetaData();
		for (int i = 1; i <= metaData.getColumnCount(); i++) {
			// System.out.print(metaData.getColumnName(i)+"\t");
			builder.append(metaData.getColumnName(i) + "\t");
		}
		builder.append("\n");
		while (rs.next()) {
			// 索引从1开始
			for (int i = 1; i <= metaData.getColumnCount(); i++) {
				// System.out.print(rs.getObject(i)+"\t");
				builder.append(rs.getObject(i) + "\t");
			}
			// System.out.println();
			builder.append("\n");
			count++;
		}
		// 将拼接的字符串写入输出流
		writeStringToFile(builder);
	}

	/**
	 * 将获取的记录输出到文件中
	 * 
	 * @param builder
	 */
	private static void writeStringToFile(StringBuilder builder) {
		// TODO Auto-generated method stub
		OutputStream oStream = null;
		ObjectOutputStream oStream2 = null;
		File file = new File(SystemUtils.getConfigPropertiesByKey("log_file"));
		if (!file.exists())
			file.mkdirs();
		try {
			String fileName = getFileName();
			File filePathFile = new File(file
					+ System.getProperty("file.separator") + fileName);
			oStream = new FileOutputStream(filePathFile);
			oStream.write(builder.toString().getBytes());
			// oStream2=new ObjectOutputStream(oStream);
			// oStream2.writeChars(builder.toString());
			// oStream2.writeObject(builder);
			// oStream2.flush();
			oStream.flush();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (oStream2 != null)
				try {
					oStream2.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if (oStream != null)
				try {
					oStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
	}

	/**
	 * 获取文件名
	 * 
	 * @return
	 */
	private static String getFileName() {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		String fileName = calendar.get(Calendar.YEAR) + "_"
				+ (calendar.get(Calendar.MONTH) + 1) + "_"
				+ calendar.get(Calendar.DAY_OF_MONTH) + ".txt";
		return fileName;
	}

	public static int getCount() {
		return count;
	}

}


前台JSP测试

<%@ page language="java" import="java.util.*,com.undergrowth.db.test.*" pageEncoding="utf-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>模拟V2数据获取</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		
	  
	</head>

	<body>
		<%
		SimulateV2Query.executeSQL();
		if(SimulateV2Query.getCount()>0)  out.print("成功获取SQL数据");
		else{
			out.print("获取SQL数据失败");
		}
		//执行查询 返回XML结果集
		SimulateV2Query.executeSqlXml();
		//执行存储过程
		SimulateV2Query.executeProcedure();
		//执行函数
		SimulateV2Query.executeFunction();
		%>
	</body>
</html>


外部配置文件

application.properties

database_type=tomcat
log_file=e\:/log/

配置文件log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{yyyy-MMM-dd HH:mm:ss} [%t] %-5p:  %c - %m%n" />
		</layout>
	</appender>
	
	<!-- Root Logger -->
	<root>
		<priority value="info" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

SQL语句配置文件

logging_sql.xml

<?xml version="1.0" encoding="utf-8" ?>
<statements>
  <statement name="TEST_NOLOGGING2">
	<![CDATA[
		SELECT tn.* from TEST_NOLOGGING2 tn WHERE tn.rule_code<2000
	]]>
	</statement>
</statements>

SQL对象配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<DBQuery queryName="TEST_NOLOGGING2">
<query>
SELECT tn.* from TEST_NOLOGGING2 tn 
</query>
</DBQuery>


测试存储过程

create or replace procedure test_simulate_v2_pro(result_info out varchar2,name in varchar2,age in int) IS
now_time DATE;
begin
  now_time :=SYSDATE;
  result_info := NAME || ',you age is ' || age || ',现在时间:' || to_char(now_time,'yyyy-mm-dd hh24:mi:ss');
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(SQLCODE || Sqlerrm);  
end test_simulate_v2_pro;


测试函数

create or replace function test_simulate_v2_func(Name in varchar2, age in int) return varchar2 is
  Result varchar2(100);
  now_time DATE;
begin
  now_time :=SYSDATE;
  Result := NAME || ',you age is ' || age || ',现在时间:' || to_char(now_time,'yyyy-mm-dd hh24:mi:ss');
  RETURN(Result);
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(SQLCODE || Sqlerrm);  
end test_simulate_v2_func;

tomcat的数据源配置

在context.xml中 添加

 <Resource name="SJPC"
       auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@ip:1521:sid"
       username="xxx"
       password="xxx"
       maxActive="100"
       maxIdle="30"
       maxWait="10000" />





最后控制台输出

2015-2-14 11:02:04 org.apache.catalina.startup.HostConfig checkResources
信息: Reloading context [/TechnoAccumu]
2015-2-14 11:02:04 org.apache.catalina.loader.WebappClassLoader validateJarFile
信息: validateJarFile(E:\some\tomcat\apache-tomcat-6.0.37\webapps\TechnoAccumu\WEB-INF\lib\geronimo-servlet_3.0_spec-1.0.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
2015-二月-14 11:02:11 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO :  com.undergrowth.db.resource.DataSourceResourceUtil - 加载SQL对象,共有2
2015-二月-14 11:02:11 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO :  com.undergrowth.db.resource.DataSourceResourceUtil - 加载SQL对象,为/WEB-INF/dbquery/logging_sql.xml
2015-二月-14 11:02:11 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO :  com.undergrowth.db.resource.DataSourceResourceUtil - 加载SQL对象,为/WEB-INF/dbquery/TEST_NOLOGGING2.xml
2015-二月-14 11:02:11 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO :  com.undergrowth.db.resource.DataSourceResourceUtil - 加载配置的SQL语句,名称为TEST_NOLOGGING2	语句为SELECT tn.* from TEST_NOLOGGING2 tn WHERE tn.rule_code<2000
2015-二月-14 11:02:11 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO :  com.undergrowth.tool.SystemUtils - 加载系统外部配置资源,总共有2
2015-二月-14 11:02:11 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO :  com.undergrowth.db.OracleDbAssist - 成功获取数据源!!
成功加载资源和数据源
执行存储过程-->模拟V2,you age is 100,现在时间:2015-02-14 11:04:10
执行函数-->模拟V2,you age is 100,现在时间:2015-02-14 11:04:10



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值