画面起動時にMDBよりデータを取得してJTable
に一覧を表示させるプログラムを作っています。
↓以下、表示ルーチン
model = DefaultTableModelです。
rs = db.getResultSet(select * from table_a);
while(rs.next())
{
Vector vecRow = new Vector(); -----気になるのがここ
for(i=1;i<7;i++) {
vecRow.addElement(rs.getString(i));
}
model.addRow(vecRow);
}
プログラムは動作しますが、Vector vecRow = new Vector()
が気になり質問させて頂きました。
このプログラムですとレコードセットの数分、アロケートしてしまい
多分この関数を抜ける迄、そのアロケートした領域は解放されない
のでは?と思い、以下のようにプログラムを変更しました。
↓変更プログラム
Vector vecRow = new Vector();//whileループの外に出した。
while(rs.next())
{
if (vecRow.isEmpty() == false) {
vecRow.clear();
}
そうしますと、動作はしますが一覧に表示される情報が全て
最後に取得したレコードセットの値になってしまいます。
C++みたいにvecRowをdeleteできれば上記のロジックでとりあえず
いいのですが・・・。
あともう一つ思いついたのですが、getResultSetの戻り値をResultSet
でなくVectorにして(以下)
public class database
{
private Vector m_rowData = null;
public Vector getResultSet(CString strSQL)
{
・・・・・・・・・・途中は省略・・・・・・・・
m_rowData = getFieldDt(recset);
・・・・・・・・・・途中は省略・・・・・・・・
return m_rowData;
}
public Vector getFieldDt(ResultSet recset)
{
Vector vecRow;
vecRow = new Vector();
・・・・・・・・・・途中は省略・・・・・・・・
return (recset)
}
これで行けると思いますが、皆さんはJAVAの場合、
このような情報一覧を表示するプログラムはどのような
コーディングをされてますでしょうか?宜しくお願いします。
ちなみにJAVA暦3日です。
>このプログラムですとレコードセットの数分、アロケートしてしまい
>多分この関数を抜ける迄、そのアロケートした領域は解放されない
>のでは?と思い、以下のようにプログラムを変更しました。
アロケートされた領域はどの変数からも参照されなくなった後、
必要に応じて解放されます。メモリに余裕があれば
解放されないこともあります。
>そうしますと、動作はしますが一覧に表示される情報が全て
>最後に取得したレコードセットの値になってしまいます。
こうなるということは、DefaultTableModelはaddRowで渡された
Vectorオブジェクトを内部でそのまま保持していて、使っているということです。
>あともう一つ思いついたのですが、getResultSetの戻り値をResultSet
>でなくVectorにして(以下)
これはVectorをnewする場所が変わっただけで、
最初のプログラムとメモリの使用に関しては変わりありません。
dairygoodsさんはじめまして。
お返事有難うございます。
>アロケートされた領域はどの変数からも参照されなくなった後、
>必要に応じて解放されます。メモリに余裕があれば
>解放されないこともあります。
そうだったんですね。手持ちの本によるとアロケートした関数を
抜ける迄解放されないと書いてあったので、レコード数分メモリ
を確保し続けるのかと思ってました。
>これはVectorをnewする場所が変わっただけで、
>最初のプログラムとメモリの使用に関しては変わりありません。
これはよ~く考えるとその通りですね・・・。
それであれから、考えた末以下の手順で作ろうかと思います。(まだできてない)
1.Vectorの配列オブジェクトを20個分用意
2.結果セットを保持する。
3.20レコード分表示(該当情報が20件以上の場合)
4.スクロールバーをクリックしたら2.の処理を行う(該当情報が20件以上の場合)。
今はaddAdjustmentListenerとかを調べている所ですが、
多分できるでしょ。とりあえず解決とさせて頂きます。