728x90
반응형
728x90
반응형

개발 하다보면 특정 날짜에 요일을 알아내야 하는 경우가 생깁니다.

자바에서 특정 날짜에서 요일 구하는 메소드 알아보겠습니다.

/**
 * 특정 날짜 요일 구하기
 * @param date
 * @param dateType
 * @return
 * @throws Exception
 */
public String getDateDay(String date, String dateType) throws Exception {
    String day = "" ;
     
    //SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd");
    //SimpleDateFormat date1 = new SimpleDateFormat("yyyyMMdd");
    //SimpleDateFormat date2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
    SimpleDateFormat dateFormat = new SimpleDateFormat(dateType) ;
    Date nDate = dateFormat.parse(date) ;
     
    Calendar cal = Calendar.getInstance() ;
    cal.setTime(nDate);
     
    int dayNum = cal.get(Calendar.DAY_OF_WEEK) ;
    
    switch(dayNum){
        case 1:
            day = "일";
            break ;
        case 2:
            day = "월";
            break ;
        case 3:
            day = "화";
            break ;
        case 4:
            day = "수";
            break ;
        case 5:
            day = "목";
            break ;
        case 6:
            day = "금";
            break ;
        case 7:
            day = "토";
            break ;
             
    }
    return day ;
}
728x90
반응형
728x90
반응형

1. DB 전체 용량 확인
select sum(bytes) from dba_data_files;

select sum(bytes)/1024/1024/1024 ||'GB' from dba_data_files;    



2. DB 사용량 확인
select sum(bytes) from dba_segments;

select sum(bytes)/1024/1024/1024 ||'GB' from dba_segments;    



3. DB 여유량 확인
select sum(bytes) from dba_free_space;

select sum(bytes)/1024/1024/1024 ||'GB' from dba_free_space; 

 

 

728x90
반응형
728x90
반응형

프로시져 실행 시 리턴값으로 사용되는 out 변수가 있을 경우 실행하는 방법입니다.

--OUTPUT 출력 메세지

DECLARE
        V_RETURNCODE VARCHAR2(100);
        V_MSG VARCHAR2(100);
BEGIN
        SP_MSG_TEST('testdata',V_RETURNCODE, V_MSG);

DBMS_OUTPUT.PUT_LINE('V_MSG------->' || V_RETURNCODE);
DBMS_OUTPUT.PUT_LINE('V_MSG------->' || V_MSG);

END;

 

728x90
반응형
728x90
반응형

Connection Timeout

  • 클라이언트가 서버측으로 connection을 맺길 원하지만 서버의 장애 상황으로 connection조차 맺어지지 못할 때 발생하는 timeout이다.

Read Timeout

  • 클라이언트와 서버가 connection은 맺어졌지만 I/O작업이 길어지거나 락이 걸려 요청이 처리되지 못하고 있을 때 클라이언트는 더 이상 기다리지 못하고 커넥션을 끊는다. 즉, 응답을 기다리지 못하는 것이다. 이런 상황을 Read Timeout 이라고 하는데 java에서는 SocketTimeout Exception이 떨어진다.

JDBC Driver SocketTimeout은 OS의 SocketTimeout 설정에 영향을 받는다. JDBC Driver SocketTimeout을 설정하지 않아도 네트워크 장애 발생 이후 30분이 지나면 JDBC Connection Hang이 복구되는 것은 OS의 SocketTimeout 설정때문이다.

Write Timeout

  • 클라이언트가 서버로 패킷을 보낼 수 있는 timeout을 설정할 수 있다. 클라이언트와 서버가 connection은 맺어졌지만 설정된 timeout의 값 보다 데이터를 보내는(요청) 시간이 길어지면 Write Timeout이 발생하여 Exception이 떨어진다.

Statement Timeout

  • 네트워크 연결 장애에 대한 timeout을 담당하는 것이 아니다.
  • Statement 하나가 얼마나 오래 수행되어도 괜찮은지에 대한 한계 값이다. JDBC API인 Statement에 타임아웃 값을 설정하며, 이 값을 바탕으로 JDBC 드라이버가 StatementTimeout을 처리한다. JDBC API인 java.sql.Statement.setQueryTimeout(int timeout) 메서드로 설정한다.

네트워크 장애에 대비하는 타임아웃은 JDBC Driver SoecketTimeout이 처리해야 한다.

Transaction Timeout

  • 프레임워크나 애플리케이션 레벨에서 유효한 타임아웃이다.
  • 간단히 설명하면 "StatementTimeout x N(Statement 수행 수) + α(가비지 컬렉션 및 기타)"라고 할 수 있다. 전체 Statement 수행 시간을 허용할 수 있는 최대 시간 이내로 제한하려 할 때 TransactionTimeout을 사용한다.

Statement 한 개를 수행할 때 0.1초가 필요하다면, 몇 개 안 되는 Statement를 수행할 때에는 문제가 없다. 그러나 Statement 10만 개를 수행할 때에는 일만 초(약 7시간)가 필요하다. TransactionTimeout은 이런 경우에 사용할 수 있다.

JDBC Driver’s SocketTimeout

  • JDBC Driver Type4는 소켓을 사용하여 DBMS에 연결하는 방식이고, 애플리케이션과 DBMS 사이의 ConnectTimeout 처리는 DBMS에서 하지 않는다.
  • JDBC 드라이버의 SocketTimeout 값은 DBMS가 비정상으로 종료되었거나 네트워크 장애(기기 장애 등)가 발생했을 때 필요한 값이다. TCP/IP의 구조상 소켓에는 네트워크의 장애를 감지할 수 있는 방법이 없다. 그렇기 때문에 애플리케이션은 DBMS와의 연결 끊김을 알 수 없다. 이럴 때 SocketTimeout이 설정되어 있지 않다면 애플리케이션은 DBMS로부터의 결과를 무한정 기다릴 수도 있다(이러한 Connection을 Dead Connection이라고 부르기도 한다). 이러한 상태를 방지하기 위해 소켓에 타임아웃을 설정해야 한다. SocketTimeout은 JDBC 드라이버에서 설정할 수 있다. SocketTimeout을 설정하면 네트워크 장애 발생 시 무한 대기 상황을 방지하여 장애 시간을 단축할 수 있다.

단, SocketTimeout 값을 Statement의 수행 시간 제한을 위해 사용하는 것은 바람직하지 않다. 그러므로 SocketTimeout 값은 StatementTimeout 값보다는 크게 설정해야 한다. SocketTimeout값이 StatementTimeout보다 작으면, SocketTimeout이 먼저 동작하므로 StatementTimeout 값은 의미가 없게 되어 동작하지 않는다.

  • SocketTimeout에는 아래 두 가지 옵션이 있고, 드라이버별로 설정 방법이 다르다.
    • Socket Connect 시 타임아웃(connectTimeout): Socket.connect(SocketAddress endpoint, int timeout) 메서드를 위한 제한 시간
    • Socket Read/Write의 타임아웃(socketTimeout): Socket.setSoTimeout(int timeout) 메서드를 위한 제한 시간

OS level socket timeout 설정

  • SocketTimeout이나 ConnectTimeout을 설정하지 않으면 네트워크 장애가 발생해도 애플리케이션이 대부분 이를 감지할 수 없다. 따라서 연결이 되거나 데이터를 읽을 수 있을 때까지 애플리케이션이 무한정 기다리게 된다. 그러나 서비스에서 발생한 실재 장애 상황에서는 30분 후에 애플리케이션(WAS)이 재연결을 시도하여 문제가 해결되는 경우가 많다. OS에서도 SocketTimeout 시간을 설정할 수 있기 때문이다. 해당 설정 값을 통해 OS 레벨에서 네트워크 연결 끊김을 확인하는 것이다. 만약 리눅스 서버의 KeepAlive 체크 수행 주기가 30분이면 SocketTimeout 설정을 0으로 해도 네트워크 장애로 인한 DBMS 연결 장애 지속 시간이 30분을 넘지 않는 것이다. Linux 서버에서 KeepAlive 체크 수행 주기는 tcp_keepalive_time로 조정할 수 있다.

 

커넥션 타임아웃에 대해 정리가 잘되어있어 공유합니다.

 

출처

- effectivesquid.tistory.com/entry/Timeout%EC%97%90-%EA%B4%80%ED%95%9C-%EC%A0%95%EB%A6%AC

728x90
반응형
728x90
반응형

 

ORA-28040: No matching authentication protocol

ORA-28040: 일치하는 인증 프로토콜 없음

 

프로젝트 셋팅중 위와 같은 오류가 발생하였는데요.

1. 오류 상세

java.sql.SQLException: SQLException in StandardPoolDataSource:getConnection exception: 
java.sql.SQLException: SQLException in StandardPoolDataSource:getConnection no connection available 
java.sql.SQLException: Cannot get connection for URL jdbc:oracle:thin:@192.168.1.xx:1521:orcl : ORA-28040: No matching authentication protocol

2. 원인

오라클 12c 서버와 클라이언트의 버전차이라고 하네요.

저같은 경우 오라클 11g에서 12c로 업그레이드 한 경우에 발생하였습니다.

 

3. 해결방법

1) jdbc.jar 파일 수정

 : ojdbc14.jar 파일을 jdk 버전에 맞게 ojdbc5~8로 수정하여 서비스 시작.

 

2) SQLNET.ORA 파일 수정

 가. SQLNET.ORA 위치로 이동

  - \app\계정\product\12.1.0\dbhome_1\NETWORK\ADMIN\sqlnet.ora

 나. 텍스트 추가

  - SQLNET.ALLOWED_LOGON_VERSION_SERVER=9
  - SQLNET.ALLOWED_LOGON_VERSION_CLIENT=9

 다. 리스너 재시작

위 방법에도 저는 해결이 안되어 문제를 찾아보니 프로젝트 lib폴더에 ojdbc14.jar 파일이 있었네요...

 

728x90
반응형
728x90
반응형

ERP와 연동하는 기능이 있는데 ERP를 고도화하면서 DB 버전이 업그레이드 되었습니다.

(window server 2008 -> SQL Server 2017, ERP는 mssql을 사용)

아래와 같은 문제가 발생하여 기존 연동하는 기능이 안되는 증상이 발생했습니다.

 

오류 내용

com.microsoft.sqlserver.jdbc.SQLServerException: 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 원인: java.lang.RuntimeException: Could not generate DH keypair

상세 오류

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 원인: java.lang.RuntimeException: Could not generate DH keypair
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(Unknown Source)
	at com.microsoft.sqlserver.jdbc.TDSChannel.throwSSLConnectionFailed(Unknown Source)
	at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
	at com.caucho.sql.DriverConfig.createDriverConnection(DriverConfig.java:596)
	at com.caucho.sql.ManagedConnectionImpl.initDriverConnection(ManagedConnectionImpl.java:242)
	at com.caucho.sql.ManagedConnectionImpl.<init>(ManagedConnectionImpl.java:131)
	at com.caucho.sql.ManagedFactoryImpl.createManagedConnection(ManagedFactoryImpl.java:121)
	at com.caucho.jca.ConnectionPool.create(ConnectionPool.java:780)
	at com.caucho.jca.ConnectionPool.allocatePool(ConnectionPool.java:649)
	at com.caucho.jca.ConnectionPool.allocate(ConnectionPool.java:608)
	at com.caucho.jca.ConnectionPool.allocateConnection(ConnectionPool.java:505)
	at com.caucho.sql.DataSourceImpl.getConnection(DataSourceImpl.java:65)
	at com.caucho.sql.DBPool.getConnection(DBPool.java:624)

원인은 구글링해보니 JDBC호환 문제라고 하네요.

기존에 사용하는 sqljdbc4.jar를 jtds-1.2.5.jar파일로 변경하였습니다.

JDBC 드라이버를 변경했으니 was config설정도 변경해주어야 합니다.

 

MSSQL JDBC 드라이버 설정 방법

Driver [com.microsoft.sqlserver.jdbc.SQLServerDriver]
URL [jdbc:sqlserver://localhost:1433;DatabaseName=DBNAME]
* JDBC드라이버 : sqljdbc.jar 또는 sqljdbc4.jar (MS-SQL 2008까지 지원)

 
Driver [net.sourceforge.jtds.jdbc.Driver]
Driver [net.sourceforge.jtds.jdbcx.JtdsDataSource]
URL [jdbc:jtds:sqlserver://localhost:1433/DBNAME;tds=8.0;lastupdatecount=true]
* JDBC드라이버 : jtds-1.2.jar
728x90
반응형
728x90
반응형

IE <area> 이미지맵으로 마우스 커서를 hand 표시하는 방법에 대해 알아보겠습니다.
style="cursor:pointer" 로 하면 될 줄 알았지만 설정해도 변경되지 않네요..
방법은 간단합니다.

area내 아래 소스만 추가해주시면 됩니다.

onmouseover="document.body.style.cursor='pointer';" onmouseout="document.body.style.cursor='default';"/>

 

<area onmouseover="document.body.style.cursor='pointer';" onmouseout="document.body.style.cursor='default';"/>

추가로 페이지를 이동하고 싶다면 href="" or onclick="" 을 사용하면 됩니다.

 

 

728x90
반응형
728x90
반응형

input text에서 한글 또는 영어로 디폴트 설정하고 싶을때가 있습니다.

input text창에 스타일 태그만 추가해주면 됩니다.

// 한글/영문
<input type='text' style="ime-mode:auto;">   

// 영문만
<input type='text' style="ime-mode:disabled;">

// 한글 (한글 / 영문 입력가능)
<input type='text' style="ime-mode:active;">

// 영문(한글 / 영문 입력가능)
<input type='text' style="ime-mode:inactive;">


728x90
반응형
728x90
반응형

+ Recent posts