[21.10.01] DBCP


java.sql.SQLException: ORA-28000: the account is locked
dbパスワードが間違っていて、ずっと接続して、dbはロックされています
したがって、/as sysdbaにログイン
入力alter user 사용자아이디 account unlock;~

サーバからクライアントにリストを返す

org.json.simple.JSONArrayサーバー
request.setCharacterEncoding("UTF-8");
String keyword=request.getParameter("keyword");
System.out.println(keyword);
		
List<String> list=dao.select(keyword);
JSONArray jsonArray=new JSONArray();
for(String title:list) {
	JSONObject jsonObject=new JSONObject();
	jsonObject.put("title", title);
jsonArray.add(jsonObject);
}
response.setCharacterEncoding("UTF-8");
response.getWriter().append(jsonArray.toString());
クライアント
$.ajax({
	type:'get',
	url:'../search.do',
	data:{keyword:val},
	success:function(result){
		console.log(result);
		var obj=JSON.parse(result);
		var list="";
		for(var x in obj){
			list+="<a href='../title.do?title="+obj[x].title+"'>"+obj[x].title+"</a><br>";
		}
		var txtHint = $('#txtHint');
		txtHint.html(list);
	}
}); //end ajax

MVCアーキテクチャモード


このときしばらく勉強してから行ってしまった
アプリケーション全体をキャラクタ別にモデル、ビュー、コントローラに分割します.
SpringのようなフレームワークにMVCモードを適用
  • 1つのデータVO(モデル)は、複数のインタフェース(ビュー)を作成することができる.
  • 再利用部品
  • モデル人


    処理するデータをグループ化するクラス

    表示


    アプリケーション・ユーザーのインタフェース領域

    せいぎょそうち


    仲介インタフェースとデータ処理.アプリケーションフルフロー制御

    典型的なWebアプリケーション構造


  • VO. DTO. domain
    DBのモデル.クラス.同じデータ型を持つデータセット
  • JSP
    view.
  • Servlet
    controller
  • サービス類
  • DAO
    CRUDを実行します.
  • DBCP(Data Base Connection Pool)


    jdbcが要求するたびに接続する欠点を補い、予め接続された接続を準備して接続プールに保存し、要求があればすぐに書き込み、プールに戻ります.トラフィックをより迅速に処理できます.
    ブラウザからサーバを呼び出すと、DB接続オブジェクトを作成するたびにオーバーロードされます.この問題を解決するために複数の接続を制御
    接続を作成する準備時間は長いが、接続時間は短い
    接続プールはloop形式で動作し続けます

    DBPPの原理


    1)Webコンテナの実行時に、「事前プール」に「接続」オブジェクトを作成します.
    2)必要に応じてプールに格納されているコネクタオブジェクトを書き込み、戻す
    3)事前作成によるデータベース負荷の軽減と接続の柔軟な管理

    DBPPのインストール

  • ojdbc6.jarファイルを\webapp\WEB-INF\libフォルダとして保存
  • ..\apache-tomcat-9.0.52\libTomcatインストールフォルダのtomcat-dbcp.jarファイルを\webapp\WEB-INF\libフォルダに保存
  • \META-INF\context.xmlリソースラベルをファイルに追加
  • <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    	<!-- DBCP(Database Connection Pool)을 사용하기 위한 Java Bean 설정 -->
    	<Resource 
    		auth="Container"
    		driverClassName="oracle.jdbc.driver.OracleDriver"
    		url="jdbc:oracle:thin:@localhost:1521:xe"
    		username="scott"
    		password="tiger"
    		name="dbcp/orcl"
    		type="javax.sql.DataSource"
    		maxTotal="50"
    		maxWaitMillis="1000"/>
    </Context>
  • url:接続DBパス
  • username:DBユーザー名
  • password:DBユーザーパスワード
  • name:JNDIで検索される名前
  • maxTotal:同時接続可能な最大接続数
  • maxWait:接続の遅延に要する待ち時間(ミリ秒)
  • 既存のJDBCを使用する場合、インタフェースにdb接続に関する定数が作成され、直接接続されます.
    DBCPがdbに接続されるように、設定に関する情報をxmlファイルに格納します.
  • \webapp\WEB-INF\web.xmlresource-refラベルファイル
  • に追加
      <resource-ref>
      	<description>Oracle DBCP Example</description>
      	<res-ref-name>dbcp/orcl</res-ref-name>
      	<res-type>javax.sql.DataSource</res-type>
      	<res-auth>Container</res-auth>
      </resource-ref>

    Connection接続/切断ユーティリティクラス

    public class ConnMgr {
    	
    	private ConnMgr() {}
    	
    	public static Connection getConnection() throws SQLException{
    		Connection conn = null;
    		
    		try {
    			Context initContext = new InitialContext();
    			Context envContext = 
    					(Context) initContext.lookup("java:comp/env");
    			DataSource ds = (DataSource) envContext.lookup("dbcp/orcl");
    			conn = ds.getConnection();
    			System.out.println("DBCP 연결 성공");
    		} catch (Exception e) {
    			e.printStackTrace();
    		} 
    		
    		return conn;
    	}
    	
    	public static void close(Connection conn, Statement stmt) {
    		try {
    			stmt.close();
    			conn.close();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public static void close(Connection conn, Statement stmt, ResultSet rs) {
    		try {
    			rs.close();
    			close(conn, stmt);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    }

    記事番号をrownumで区切る


    文章番号が一番多いのは最新の文章なので、降順で最新の文章を上端に表示すべきです.
    select b.*
    from(
        select rownum rn, a.* 
        from (
            select * from board order by bno desc
        )a
    )b
    where rn between 1 and 5;
  • select * from board order by bno desc:すべてのデータをインポート(降順)
  • select rownum rn, a.* ...:降順データを1番からrownumへ
    記事番号が10~1の場合、記事番号は10=rownum 1

  • 完全なクエリー:rownumが1~5のデータを出力します.
  • オーサリング用ライブラリの設定は最初の@@