Hallo, ich habe folgenden Code den ich dank der Hilfe hier zusammengeschustert habe:
Klasse Test1:
Und Klasse NumberGenerator:
Kurz zur Erklärung:
Ich benutze SQlite und den jdbc Server Kram um an einer test2.db SQL Datenbank rumzuwerkeln.
Die beiden dort vorkommenden Tabellen sind:
Mein Test1 Programm soll erst eine Verbindung zu Datenbank, Tabellen und Co. herstellen, dann die 2 Tabellen erstellen und die "Tuples" Tabelle dann mit 2 Spalten SixtupleId und TripleId befüllen.
Hierzu wird in der "fill2" Methode alle möglichen Sixtuple (Also die Zahlentupel (1,2,3,4,5,6) bis (44,45,46,47,48,49)) durchgegangen und mit allen jeweils darin enthaltenen Tupel kombiniert.
Jede solche Kombination kommt in die Tabelle.
Ergebnis sieht dann so aus:
(siehe Bild)
Nur das Problem:
Augenscheinlich werden nicht alle Sixtupel und deren Triple aufgelistet.
Das letzte bearbeitete Sixtupel in der Liste ist (41,43,44,47,48,49), da fehlt offensichtlich so Manches (der Screenshot zeigt die letzten Einträge der Datenbanktabelle).
Man sieht es auch rein an der Anzahl der Einträge in der Datenbank:
Dort wurden 279.675.521 geladen, allerdings müssten es reinrechnerisch insgesamt 20*(49 über 6)=279676320 sein.
Es fehlen also um die 1000 Einträge!
Ich habe keine Ahnung warum die Einträge nicht drin sind!
Vom Java Progam her müssten alle Sachen bearbeiet werden,
Habe es mit diversen tests gesprüft:
Es werden alle möglichen Sixtuple erzeugt und auch deren 20 Tripel werden auch richtig erzeugt.
Es MÜSSTEN also alle Einträge in die Tabelle eingefügt worden sein!
Laut SQliteStudio, mit der ich mir den Datenbankinhal angucke, fhelen da aber wie gesagt rund 1000 Einträge.
Kann es sein dass rein die Anzahl an gepanten Tabellenzeilen zu groß ist (halt um die 280 Millionen zeilen mit je 2 Einträgen) und die trotz passender Befehle deshalb nicht alle erzeugt wurden oder so?
Oder woran könnte das liegen?
Klasse Test1:
Java:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.sqlite.SQLiteDataSource;
public class Test1 {
SQLiteDataSource ds = null;
Connection conn = null;
Statement stmt = null;
public static void main(String[] args) {
try {
Test1 a = new Test1();
// a.deleteTables();
// a.createTables();
a.fill2();
/*
* ResultSet rs = a.execQuery("SELECT Count(DISTINCT SixtupleId) FROM Tuples");
* System.out.println("A"); while (rs.next()) {
* System.out.println(rs.getString(1)); } a.closeAll();
*/
a.conn.commit();
a.closeAll();
} catch (Exception e) {
}
}
public Test1() {
try {
ds = new SQLiteDataSource();
ds.setUrl("jdbc:sqlite:test2.db");
conn = ds.getConnection();
stmt = conn.createStatement();
conn.setAutoCommit(false);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Opened database successfully");
}
public void createTables() {
try {
String query = "CREATE TABLE IF NOT EXISTS Tuples (" + "SixtupleId STRING NOT NULL,"
+ " TripleId STRING NOT NULL)";
execUpdate(query);
query = "CREATE TABLE IF NOT EXISTS ConCount (" + "TripleID STRING NOT NULL,"
+ "Occurences INTEGER NOT NULL)";
execUpdate(query);
conn.commit();
} catch (Exception e) {
}
}
public void deleteTables() {
try {
execUpdate("DROP TABLE IF EXISTS 'Tuples' ");
execUpdate("DROP TABLE IF EXISTS 'ConCount' ");
conn.commit();
} catch (Exception e) {
}
}
public void closeAll() {
try {
stmt.close();
} catch (Exception e) {
}
try {
conn.close();
} catch (Exception e) {
}
}
public void execUpdate(String query) {
try {
int rv = stmt.executeUpdate(query);
System.out.println("executeUpdate() returned " + rv);
} catch (SQLException e) {
e.printStackTrace();
System.exit(0);
}
// System.out.println("Executed Code: " + query);
}
/*
* public ResultSet execQuery(String query) { try { ResultSet rv =
* stmt.executeQuery(query); System.out.println("executeUpdate() returned " +
* rv); return rv; } catch (SQLException e) { e.printStackTrace();
* System.exit(0); } System.out.println("Error with Query!"); return null;
*
* }
*/
public String toString(int[] xTupel) {
StringBuilder builder = new StringBuilder();
for (int x : xTupel) {
builder.append(x);
builder.append(".");
}
return builder.toString();
}
public void fill2() {
try {
int count = 0;
NumberGenerator numg = new NumberGenerator(6, 1, 49);
int batchSize = 1000;
int currentSize = 0;
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO Tuples (SixtupleId, TripleId) VALUES (?,?)");
int[] tripel = null;
int[] sixtupel = numg.getNumberb();
count++;
do {
System.out.println(toString(sixtupel));
// sixTupel
for (int i1 = 0; i1 < sixtupel.length - 2; i1++) {
for (int i2 = (i1 + 1); i2 < sixtupel.length - 1; i2++) {
for (int i3 = (i2 + 1); i3 < sixtupel.length; i3++) {
tripel = new int[] { sixtupel[i1], sixtupel[i2], sixtupel[i3] };
// hier musst du halt deine Zahlen vorbereiten
pstmt.setString(1, toString(sixtupel));
pstmt.setString(2, toString(tripel));
// das fügt das statement zu deiner batch hinzu
pstmt.addBatch();
currentSize++;
if (currentSize == batchSize - 2) {
// falls das batch voll ist führ es aus
// batches nicht zu groß machen, lieber öfter abschicken
pstmt.executeBatch();
// System.out.println("Sent batch at count=" + count);
currentSize = 0;
}
}
}
}
sixtupel = numg.getNumberb();
count++;
} while (sixtupel != null);
pstmt.executeBatch();
System.out.println("Generated " + count + " different Sixtupels!");
// conn.commit();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Und Klasse NumberGenerator:
Java:
import java.util.Arrays;
public class NumberGenerator {
int length = 6;
int maxNum = 49;
int minNum = 1;
byte[] a;
int[] b;
public NumberGenerator(int length, int minNum, int maxNum) {
this.length = length;
this.minNum = minNum;
this.maxNum = maxNum;
a = new byte[length];
for (byte i = 0; i < a.length; i++) {
a[i] = (byte) (i + 1);
}
b = new int[length];
for (int i = 0; i < a.length; i++) {
b[i] = (int) (i + 1);
}
}
public static void main(String[] args) {
NumberGenerator q = new NumberGenerator(3, 1, 49);
q.printb();
}
public boolean endReachedb() {
if (b[b.length - 1] < maxNum) {
return false;
}
for (int i = b.length - 1; i > 0; i--) {
if (b[i] > b[i - 1] + 1) {
return false;
}
}
return true;
}
public int[] copyb() {
if (b == null) {
return null;
}
int[] c = new int[b.length];
for (int i = 0; i < b.length; i++) {
c[i] = b[i];
}
return c;
}
public void printb() {
int z = 0;
int[] q = getNumberb();
while (q != null) {
z = z + 1;
System.out.println(Arrays.toString(q));
q = getNumberb();
}
System.out.println("Total of " + z + " numbers found!");
}
public int[] getNumberb() {
int[] d = copyb();
if (d == null) {
return null;
}
if (endReachedb()) {
b = null;
} else {
int c = b.length - 1;
while (c >= 0 && b[c] == maxNum - (length - c - 1)) {
c--;
}
b[c] = b[c] + 1;
for (int i = c; i < b.length; i++) {
b[i] = b[c] + (i - c);
}
}
return d;
}
}
Kurz zur Erklärung:
Ich benutze SQlite und den jdbc Server Kram um an einer test2.db SQL Datenbank rumzuwerkeln.
Die beiden dort vorkommenden Tabellen sind:
SQL:
CREATE TABLE Tuples (
SixtupleId STRING NOT NULL,
TripleId STRING NOT NULL
);
CREATE TABLE ConCount (
TripleID STRING NOT NULL,
Occurences INTEGER NOT NULL
);
Mein Test1 Programm soll erst eine Verbindung zu Datenbank, Tabellen und Co. herstellen, dann die 2 Tabellen erstellen und die "Tuples" Tabelle dann mit 2 Spalten SixtupleId und TripleId befüllen.
Hierzu wird in der "fill2" Methode alle möglichen Sixtuple (Also die Zahlentupel (1,2,3,4,5,6) bis (44,45,46,47,48,49)) durchgegangen und mit allen jeweils darin enthaltenen Tupel kombiniert.
Jede solche Kombination kommt in die Tabelle.
Ergebnis sieht dann so aus:
(siehe Bild)
Nur das Problem:
Augenscheinlich werden nicht alle Sixtupel und deren Triple aufgelistet.
Das letzte bearbeitete Sixtupel in der Liste ist (41,43,44,47,48,49), da fehlt offensichtlich so Manches (der Screenshot zeigt die letzten Einträge der Datenbanktabelle).
Man sieht es auch rein an der Anzahl der Einträge in der Datenbank:
Dort wurden 279.675.521 geladen, allerdings müssten es reinrechnerisch insgesamt 20*(49 über 6)=279676320 sein.
Es fehlen also um die 1000 Einträge!
Ich habe keine Ahnung warum die Einträge nicht drin sind!
Vom Java Progam her müssten alle Sachen bearbeiet werden,
Habe es mit diversen tests gesprüft:
Es werden alle möglichen Sixtuple erzeugt und auch deren 20 Tripel werden auch richtig erzeugt.
Es MÜSSTEN also alle Einträge in die Tabelle eingefügt worden sein!
Laut SQliteStudio, mit der ich mir den Datenbankinhal angucke, fhelen da aber wie gesagt rund 1000 Einträge.
Kann es sein dass rein die Anzahl an gepanten Tabellenzeilen zu groß ist (halt um die 280 Millionen zeilen mit je 2 Einträgen) und die trotz passender Befehle deshalb nicht alle erzeugt wurden oder so?
Oder woran könnte das liegen?