Q&A: Wie kann man die Netzwerkübertragung besser optimieren?

Bei der Client-Server-Kommunikation meines Spiels harkt es und das auch nur bei einem Spieler, was kann man tun?

Es gibt kaum Möglichkeiten zur Optimierung im Java-Umfeld. Die Netzwerkverbindung sollte auf bleiben, sodass keine (große) Zeit für den Neuaufbau anfällt. Serialisierung ist nicht so teuer, GZippen wird auch nicht viel bringen. Im lokalen Netz ist time(UDP) = time(TCP) und bei UDP muss man zu viel selbst machen, da bringt auch ein Protokollwechsel im Grunde nichts. NIO wäre mit Kanonen auf Spatzen und lohnt sich nur bei vielen Verbindungen. Eventuell bringt Nagle noch was: http://www.davidreilly.com/java/java_network_programming/#3.3.

Q&A: JDBC ResultSet aus Text-Datei oder Excel füllen

Frage: Ich möchte ein ResultSet mit Daten aus einem Excel oder einem Textfile laden.

Antwort: Die Möglichkeit besteht. Dazu nutzt man einen JDBC-Treiber, der auf Textdateien arbeitet. http://csvjdbc.sourceforge.net/ (CsvJdbc Home) bietet das für Textdateien (CSV), für Excel gibt es so was auch, http://sourceforge.net/projects/xlsql/ (Excel JDBC Driver | Free Development software downloads at SourceForge.net).

Q&A: Optimiert der Java-Compiler die Multiplikation konstanter Faktoren?

Wenn ich in mein Quellcode schreibe:

int i = 60 * 1000;

Wie kompiliert javac das? Wird die Rechenoperation schon zur Compile-Zeit ausgeführt, oder erst zur Laufzeit?

Antwort: Diese "compile-time constant expression" optimiert der Compiler. Im Bytecode steht dann nur 60000. Siehe dazu auch http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28.

Q&A: Wie kann man eine XML-Datei aus einer bz2-Datei mit StAX ablaufen?

Zunächst liefert org.apache.commons.compress.compressors.bzip2.BZip2InputStream aus dem Apache Commons Compress (https://commons.apache.org/proper/commons-compress/) einen InputStream. Diesen übergibt man dann StAX:

InputStream fis = new FileInputStream( file ); // vielleich noch puffern 
InputStream bz2is = new BZip2InputStream( fis ); 
XMLInputFactory factory = XMLInputFactory.newInstance(); 
XMLStreamReader parser = factory.createXMLStreamReader( bz2is );

Q&A: Wie kann man die Foreign Keys einer Tabelle rausfinden

Die Metadaten können direkt erfragt werden. Quelle: https://svn.apache.org/repos/asf/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/DatabaseMetaDataWrapper.java.

/**
* Convenience method to return the foreign key meta data using the configured catalog and
* schema pattern.
*
* @param tableNamePattern The pattern identifying for which tables to return info
* @return The foreign key meta data
* @throws SQLException If an error occurred retrieving the meta data
* @see DatabaseMetaData#getImportedKeys(java.lang.String, java.lang.String, java.lang.String)
*/
public ResultSet getForeignKeys(String tableNamePattern) throws SQLException
{
  return getMetaData().getImportedKeys(getCatalog(), getSchemaPattern(), tableNamePattern);
}

Dahinter steckt also http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#getImportedKeys(java.lang.String,%20java.lang.String,%20java.lang.String)

__________________

Q&A: Wie kann man einem Thread eine bestimmte Zeit zur Ausführung geben?

Eine Idee ist, nicht einen eigenen Thread selbst zu starten — was man sowieso nicht so oft macht — sondern einen ThreadPool aus Java 5 mit einzusetzen (Executors#newCachedThreadPool() ), der einen Executer (ExecutorService) implementiert. Der ExecutorService hat eine Funktion submit(Runnable task), die ein Future liefert. Mit diesem Future arbeitest du dann mit get(long timeout, TimeUnit unit).

Code:

package com.tutego;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ExitAfterATime
{
  public static void main( String[] args )
  {
      ExecutorService es = Executors.newCachedThreadPool();
      Future<?> submit = es.submit( new Runnable() {
        @Override public void run()
        {
          try { Thread.sleep( 2000 ); } catch ( InterruptedException e ) { System.out.println("InterruptedException"); }
        } } );

      try
      {
        submit.get( 500, TimeUnit.MILLISECONDS );
      }
      catch ( InterruptedException e )
      {
      }
      catch ( ExecutionException e )
      {
      }
      catch ( TimeoutException e )
      {
        System.out.println( "Canceling" );
        submit.cancel( true );
        System.out.println( "Canceling Done" );
      }

      es.shutdownNow();
  }
}

Es gibt noch andere Lösungen und das concurrent Paket bietet viele Möglichkeiten. Der Programmcode muss aber mitspielen und auch beendet werden können, also cancel(…) unterstützen.

java-forum.org und Burger King

Gestern kam auf ZDFinfo ein "schöner" Beitrag, der mich absolut an den Vorfall hier erinnert — zum Nachschauen: http://www.zdf.de/ZDFmediathek/kanaluebersicht/aktuellste/398#/beitrag/video/1951570/ZDFzoom:-Gewinn-ist-King.

2010 kaufte der New Yorker Finanzinvestor 3G Capital für 4 Milliarden US-Dollar den Burgerbrater und will das Investment nun zu Geld machen. An der Börse zahlt sich das aus, aber auf Kosten der Mitarbeiter und Franchise-Unternehmer. Das ist im Grunde das gleiche wie beim JFO; auch hier kommt ein "Investor" und versucht über Werbung schnell seine Ausgaben wieder reinzuholen. An ein langfristiges Investment geht es den Venture Capitalist gar nicht, denn nach einer kurzen Gewinnphase (die nur die Aktionäre freut) wird ein Unternehmen nach guten Gewinnen in der Regel wieder weiterverkauft, und dann ist es meist kaputt. Beim JFO befürchte ich das gleiche: Wenn das JFO wieder geöffnet ist, und voll von Google Werbung ist, wird Geld reinkommen — dass die Community kaputt geht, ist dem Investor egal, der kann wohl auch nichts mit Java anfangen weiß vermutlich auch gar nicht was das ist. Daher glaube ich auch nicht, dass man dem jetzigen Inhaber die Domain wieder abkaufen kann, denn mit Google Werbung wird auf Jahre hinaus wohl einiges zu verdienen sein, auch wenn das Forum passiv bleibt. Hier geht’s ums Geld, das ist alles, es ist ein Geschäftsmodell. Mit moralischen Appellen kommt man hier nicht weiter.

Siehe auch http://forum.byte-welt.net/showthread.php?t=4636.

Auf Wiedersehen javainsel.blogspot.de

Von November 2005 bis März 2010 betrieb ich meinen Java-Blog bei Google unter der Domain javainsel.blogspot.de. In der Zeit hatte ich an die 300 Posts geschrieben und fast 40.000 Seitenaufrufe gehabt. Im Jahr 2010 habe ich dann eine WordPress-Installation auf meinem Server gesetzt und dort weitergebloggt. Nach einer Migration der alten Artikel in das aktuelle WP-System wurde es nun Zeit, bei Google den alten Blog zu löschen. Bye-Bye Google Blogger, die Daten gehören jetzt wieder mir.

www.java-forum.org ist kaputt

Das Forum wurde geschlossen, zu den Gründen hier: http://forum.byte-welt.net/showthread.php?t=4538 (lange Diskussion) oder kürzer http://www.c-plusplus.de/forum/318939 und https://www.sourceprojects.org/default/2013/08/01/1375340100000.html. Schnell gesagt: Schnelles Geld und Gier ruiniert Communities.

So ein Vorgang macht wieder klar, dass man immer Herr seiner Daten sein sollte. Alle meine Beiträge (>100?) sind nun futsch, die alten Antworten werden keinen mehr erreichen. Meine Konsequenz daraus? Ich werde auf kein Forum mehr Texte stellen, nichts mehr direkt beantworten, nur noch ausschließlich hier im Blog und dann eventuell von Foren aus hier zum Blog verlinken. Mein Server, meine Daten, meine Sicherheit.