tech_memo
プロファイラ †
async-profiler †
- スクリプトだけでframe graphを作成できる。
- On docker
Java Mixed-Mode Flame Graphs で Java の CPU ネックをフルスタックで分析する †
- perf + javaツールでflame graphを作成
ヒープ・GC †
SAStrutsで外だし設定ファイルを利用する方法(S2configを使う) †
- セットアップと利用手順は下記が参考になる
- ただし、上記参考サイトでは、configContainer#findAllConfigValue?()を利用しているが、これはうまくいかなかった。
- 公式のサンプルでは、configContainer#getConfigString?()を利用していたので、これはうまくいった。
DB関連 †
Oracle PL/SQLファンクションをコールするときの注意 †
Oracleプロシージャでユーザ定義型(STRUCT)、ユーザ定義型を引数に指定 †
Oracleプロシージャ(ファンクション)にARRAY引数を渡すのが遅い †
- ArrayDescripter?からARRAYオブジェクトを生成するときが激遅い。[ key1, key2 ] の配列1000個以上で10秒以上かかる
ArrayDescriptor ad = new ArrayDescriptor(MY_KEY_TYPE, con);
ARRAY array = new ARRAY(ad, con, key1AndKey2Array); // ★ここが遅い。key1AndKey2Arrayは、ORADataを実装した自作クラスの配列
- ARRAYオブジェクトをJava側で定義するときに、ORADataを実装するのではなく、SQLDataを実装すると早くなるらしい
- 確かに、ARRAYの生成は早くなったが、今度はプロシージャの中が遅くなった。(上記対応前は早かった)
- 上記ARRAYはプロシージャ内で、TABLE型にキャストしてIN句のリストとして使用している。
- なぜ遅いかは謎。。。
Seasar2のConnection(ConnectionWrapperImpl?)からOracleプロシージャにユーザ定義型引数を設定 †
- 上記OracleConnection?を利用してユーザ定義型を引数に渡す方法
CallableStatement stmt = con.prepareCall("Call TEST(?)");
String[] strArry = { "121313", "12121" };
ArrayDescriptor ad = new ArrayDescriptor("STR_TABLE_TYPE", con);
ARRAY array = new ARRAY(ad, con, strArry);
stmt.setArray(1, array);
stmt.execute();
Javaからストアドプロシージャのコール †
- 以下はOracleの場合
- プロシージャ
CREATE OR REPLACE PROCEDURE TEST1(
n1 IN INT,
n2 IN OUT INT,
n3 OUT INT) AS
BEGIN
n3 := n1 * n2;
n2 := n2 + 1;
END;
/
- Javaソース
try (Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:TESTDB", "TEST", "testpass")) {
try (CallableStatement statement = connection.prepareCall("CALL TEST1(?, ?, ?)")) {
statement.registerOutParameter(2, Types.INTEGER);
statement.registerOutParameter(3, Types.INTEGER);
statement.setInt(1, 5);
statement.setInt(2, 7);
statement.execute();
System.out.println(String.format("n2 = %d", statement.getInt(2)));
System.out.println(String.format("n3 = %d", statement.getInt(3)));
}
}
- MySQLの場合
Seasar2を使った場合 †
- 参考
- プロシージャの引数になるクラス
public class MyDto {
public String arg1; // 第1引数 (IN)
@Out
public String arg2; // 第2引数 (OUT)
@InOut
public int arg3; // 第3引数 (INOUT)
}
- プロシージャ実行
MyDto dto = new MyDto();
dto.arg1 = "hoge";
dto.arg3 = 2;
jdbcManager
.callBySql(
"{call myproc(?, ?, ?)}",
dto)
.execute();
System.out.println(dto.arg2);
System.out.println(dto.arg3);
JDBC関連システムプロパティ †
thinドライバでのORACLE接続 †
RAC †
Webコンテナなしで、簡単なSoap Webサーバ・クライアント作成 †
Soap Webサーバ †
- 参考 : http://java.keicode.com/lib/ws-create-service.php
- javax.xml.ws.Endpoint#publish() を利用すると、標準Javaオンリーで、JAX-WS(Java API for XML-Based Web Services) による単純な Web サービスを起動可能
- Webサービスクラス
package jp.noorg.web;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public class HelloWeb {
public String hello(@WebParam(name = "name") String name) {
return "Hello " + name + "!!";
}
}
- Webサーバ起動メインクラス
package jp.noorg.main;
import javax.xml.ws.Endpoint;
import jp.noorg.web.HelloWeb;
public class HelloMain {
public static void main(String[] args) {
Endpoint.publish(
"http://localhost:8888/WebServices/hello",
new HelloWeb());
}
}
- 上記メインクラスを起動後、上記URLに"?wsdl"を付随してブラウザでアクセスするとWSDLを参照可能
Soapクライアント †
- Eclipseで、上記WSDLからソースを取り込む方法
- プロジェクトファイルを右クリック
- 新規>その他>Webサービス>Webサービス・クライアント
- サービス定義に、WSDLのURLを指定
- あとは適当にポチポチ
- 取り込んだソースからWebサービスを呼び出す
package jp.noorg.main;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import jp.noorg.web.HelloWeb;
import jp.noorg.web.HelloWebService;
import jp.noorg.web.HelloWebServiceLocator;
public class ClientMain {
public static void main(String[] args) throws ServiceException, RemoteException {
HelloWebService locator = new HelloWebServiceLocator();
HelloWeb port = locator.getHelloWebPort();
System.out.println(port.hello("Hoge"));
}
}
Webスクレイピング †
テスト関連 †
アサーション †
- JUnit 4 (assertThatとかカスタムMatcherとか)
- Hamcrest(JUnit)とAssertJ比較
Setup †
JDKをWindowsでインストールせずに利用 †
- 7zipでJDKのインストーラを解凍
- ちなみに、cygwinのp7zipコマンドではエラーになった
$ p7zip -d jdk-8u144-windows-x64.7z
7-Zip (a) [64] 15.14 : Copyright (c) 1999-2015 Igor Pavlov : 2015-12-31
p7zip Version 15.14.1 (locale=en_US.utf8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i3-4005U CPU @ 1.70GHz (40651),ASM,AES-NI)
Scanning the drive for archives:
1 file, 207382584 bytes (198 MiB)
Extracting archive: jdk-8u144-windows-x64.7z
ERROR: jdk-8u144-windows-x64.7z
jdk-8u144-windows-x64.7z
Open ERROR: Can not open the file as [7z] archive
ERRORS:
Is not archive
Can't open as archive: 1
Files: 0
Size: 0
Compressed: 0
- 解凍したフォルダにtools.zipができるので、それも解凍
- cygwinでunzipすると解凍ファイルに実行権限が付与されない。実行権限を付与しないと、以降の作業がうまくいかないので注意。
- 解凍したフォルダ内の、一部のjarファイルが、pack200形式で圧縮されているので、解凍したフォルダ内にあるunpack.exeを使用して、jarファイルに変換する
- <tool.zip解凍フォルダ>をJAVA_HOMEとして、パスを通せばOK
- 本方法を実施後、Eclipseが起動できなかった、解決方法は以下。
Excel操作 †
- Apache POIを使用
- POIライブラリ
- ソースサンプル
セル 結合 †
罫線 †
SSL/TLS †
client †
自身のPIDを取得 †
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
ManagedExecutorService? †
Java Flight Recorder †
- Oracle WebLogic? server, Java, アプリケーションの稼働詳細を自動記録
- フライと記録のGUI解析
- 実行中Javaの状況リアルタイム監視
ArrayList?とHashSet?の検索アルゴリズム †
- equalsメソッドと、hashCodeメソッドを使用している。
Objectが同じものかのAssertion †
複数Mainクラスを持つjarファイルの実行 †
[tmi@sv11 ~]$ java -classpath test-driver.1.0.0-jar-with-dependencies.jar myapp.main.SimpleServletMain
Network †
HttpClient? †
HttpURLConnectionのタイムアウト †
Spring †
JdbcTemplate?作成方法 †
Spring-boot †
Java EE †
- Java EEとは?EEサーバとは?JSRとは?
- Java EE(6以前)で、自前でスレッド生成してはいけない理由
- Java EE5、6、7の非同期・並列処理についてと、7での非同期・並列処理方法
Java SE †
byte配列から値参照 †
byte[] b = Encoder.stringToBinary(lowResImageB64)
String hexHeight = String.format("%02x%02x", b[8], b[9])
int height = Integer.decode("0x${hexHeight}")
println height
Mapの全要素参照 †
JVM †
Classのprivateメソッドを参照する †
最新の20件
2023-01-26
2022-11-11
2022-03-02
2022-02-03
2021-11-18
2021-11-11
2021-10-27
2021-10-04
2021-09-30
2021-08-24
2021-04-01
2021-02-25
2020-08-13
2020-05-22
2020-04-16
2020-04-15
2020-03-23
2020-03-12
2020-02-27
今日の20件
- counter: 931
- today: 2
- yesterday: 1
- online: 1